POJ 3468 A Simple Problem with Integers

题目链接:点击打开链接


区间修改区间查询,练习lazy标记模板题。

lazy标记在更新和下放的时候也是要+=到下面的,而不是直接=赋值,没注意到这点wa了几次。


代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define MAX 100010
#define ll long long
using namespace std;
ll sum[MAX<<2];
ll col[MAX<<2];
void pushup(int rt){
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}

void pushdown(int rt,int len){
    if(col[rt]){
        col[rt<<1]+=col[rt];
        col[rt<<1|1]+=col[rt];
        sum[rt<<1]+=(len-(len>>1))*col[rt];
        sum[rt<<1|1]+=(len>>1)*col[rt];
        col[rt]=0;
    }
}

void build(int l,int r,int rt){
    col[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,ll k,int l,int r,int rt){
    if(L<=l&&R>=r){
            sum[rt]+=(r-l+1)*k;
            col[rt]+=k;
            return ;
    }
    pushdown(rt,r-l+1);
    int m=(l+r)>>1;
    if(L<=m) update(L,R,k,lson);
    if(R>m) update(L,R,k,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);
    ll res=0;
    int m=(l+r)>>1;
    if(L<=m) res+=query(L,R,lson);
    if(R>m) res+=query(L,R,rson);
    pushup(rt);
    return res;
}

int main(){
    int N,Q;
    while(~scanf("%d%d",&N,&Q)){
            build(1,N,1);
            for(int i=1;i<=Q;i++){
                char c[4];
                int a,b;
                ll k;
                scanf("%s",&c);
                if(c[0]=='C') {
                    scanf("%d%d%lld",&a,&b,&k);
                    update(a,b,k,1,N,1);
                }
                else{
                    scanf("%d%d",&a,&b);
                    printf("%I64d\n",query(a,b,1,N,1));
                }
            }
    }
    return 0;
}








你可能感兴趣的:(线段树)