HDOJ 1166 敌兵布阵(线段树 单点更新 区间求和)

#include <bits/stdc++.h>
#define maxn 200010
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
using namespace std;
int Sum[maxn<<2],Lazy[maxn<<2];
int A[maxn];
void PushUp(int rt){Sum[rt]=Sum[rt<<1]+Sum[rt<<1|1];}
int N,Q,lq,rq,val;
void Build(int l,int r,int rt){
    if(l==r) {
        Sum[rt] = A[l];
        return;
    }
    int m=(l+r)>>1;
    Build(l,m,rt<<1);
    Build(m+1,r,rt<<1|1);
    PushUp(rt);
}
void UpdatePoint(int L,int C,int l,int r,int rt){
    if(l==r){
        Sum[rt]+=C;
        return;
    }
    int m=(l+r)>>1;
    if(L <= m) UpdatePoint(L,C,l,m,rt<<1);
    else UpdatePoint(L,C,m+1,r,rt<<1|1);
    PushUp(rt);
}
void PushDown(int rt,int ln,int rn){
    if(Lazy[rt]){
        Lazy[rt<<1] = Lazy[rt];
        Lazy[rt<<1|1] = Lazy[rt];
        Sum[rt<<1] = Lazy[rt]*ln;
        Sum[rt<<1|1] = Lazy[rt]*rn;
        Lazy[rt]=0;
    }
}
void UpdateInterval(int L,int R,int C,int l,int r,int rt){
    if(L <= l && r <= R){
        Sum[rt] = C*(r-l+1);
        Lazy[rt] = C;
        return ;
    }
    int m=(l+r)>>1;
    PushDown(rt,m-l+1,r-m);
    if(L <= m) UpdateInterval(L,R,C,l,m,rt<<1);
    if(R >  m) UpdateInterval(L,R,C,m+1,r,rt<<1|1);
    PushUp(rt);
}

int Query(int L,int R,int l,int r,int rt){
    if(L <= l && r <= R){
        return Sum[rt];
    }
    int m = (l+r)>>1;
    PushDown(rt,m-l+1,r-m);
    int ANS = 0;
    if(L <= m) ANS += Query(L,R,l,m,rt<<1);
    if(R > m) ANS += Query(L,R,m+1,r,rt<<1|1);
    return ANS;
}
int main()
{
    int n,t;
    char ss[20];
    cin>>t;
    for(int i = 1;i<=t;++i){
       printf("Case %d:\n",i);
       cin>>n;
       for(int j=1;j<=n;j++) cin>>A[j];
       Build(1,n,1);
      while(scanf("%s",ss) && ss[0] != 'E'){
            if(ss[0] == 'Q'){
                int L,R;
                scanf("%d%d",&L,&R);
                printf("%d\n",Query(L,R,1,n,1));
            }else if(ss[0] == 'A'){
                int L,c;
                scanf("%d%d",&L,&c);
                UpdatePoint(L,c,1,n,1);
            }else if(ss[0] == 'S'){
                int L,c;
                scanf("%d%d",&L,&c);
                UpdatePoint(L,-c,1,n,1);
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37360631/article/details/81462235
今日推荐