POJ 3468A Simple Problem with Integers(线段树 + Lazy Tag(延迟更新))

来源:互联网 发布:金融大数据就业前景 编辑:程序博客网 时间:2024/05/16 01:41

题目意思还是比较好理解的 大概是给你一些数字然后   操作也比较简单  只有两种操作  查询和更新   不过是需要用到线段树的延迟更新的  比较裸的模板题(羞耻~~)


尝试了好久用树状数组来写这个  但是后来发现树状数组好像是没有办法代替有延迟更新的线段树的 然后就放弃了 感觉还是有什么不知道的黑科技数据结构可以写这道题的吧~~




代码写的可能比较长  不过分块来看还是比较好理解的吧 

#include<cstdio>#include<cstring>#define lson l,m,rt << 1#define rson m + 1 , r, rt << 1 | 1typedef long long ll;const int maxn = 100005;ll sum[maxn << 2];ll add[maxn << 2];void Pushup(int rt){    sum[rt] = sum[rt << 1] + sum[rt << 1 |1];}void Pushdown(int rt,int m){    if (add[rt]) {        add[rt << 1] += add[rt];        add[rt << 1 | 1] += add[rt];        sum[rt << 1] += add[rt] * (m - (m >> 1));        sum[rt << 1 | 1] += add[rt] *(m >> 1);        add[rt] = 0;    }}void build(int l,int r,int rt){    add[rt] = 0;    if(l == r) {        scanf("%lld",&sum[rt]);        return ;    }    int m = (l + r) >> 1;    build(lson);    build(rson);    Pushup(rt);}void Update(int L,int R,int c,int l,int r,int rt) {    if (L <= l && r <= R) {       add[rt] += c;       sum[rt] += (ll)(c * (r - l + 1));        return ;    }    Pushdown(rt , r - l + 1);    int m = (l + r) >> 1;    if (L <= m)Update(L , R, c, lson);    if (R > m)Update(L , R, c, rson);    Pushup(rt);}ll query(int L,int R,int l,int r,int rt){    if (L <= l && r <= R) {        return sum[rt];    }    Pushdown(rt , r - l + 1);    int m = (l + r) >> 1;    ll ret = 0;    if (L <= m)ret += query(L , R, lson);    if(R > m)ret += query(L , R, rson);    return ret;}int main(){    char op[10];    int n , m, a, b, c;    while (~scanf("%d%d",&n,&m)) {        build(1 , n, 1);        for (int i = 0; i < m; i ++) {            scanf("%s",op);            if (op[0] == 'C') {                scanf("%d%d%d",&a,&b,&c);                Update(a , b, c, 1 , n, 1);            }            else if(op[0] == 'Q') {                    scanf("%d%d",&a,&b);                printf("%lld\n",query(a , b, 1, n, 1));            }        }    }}


0 0
原创粉丝点击