hdu 1166 敌兵布阵(简单线段树or树状数组)

题意:

N个工兵营地,第i个营地有ai个人。

三种操作:

1.第i个营地增加x个人。

2.第i个营地减少x个人。

3.查询第i个到第j个营地的总人数。

思路:

线段树or树状数组

代码:(树状数组)

int n;
int a[50005];
int C[50005];

void init(){
    rep(i,1,n){
        C[i]=0;
        for(int j=i-lowbit(i)+1;j<=i;j++){
                C[i]+=a[j];
        }
    }
}
void add(int x,int y){
    for(int i=x;i<=n;i+=lowbit(i)){
        C[i]+=y;
    }
}

int calc(int x){
    if(x==0) return 0;
    int ans=0;
    for(int i=x;i>0;i-=lowbit(i))
        ans+=C[i];
    return ans;
}
int query(int x,int y){
    return calc(y)-calc(x-1);
}

int main(){

    int T;
    cin>>T;
    rep(t,1,T){
        scanf("%d",&n);
        rep(i,1,n){
            scanf("%d",&a[i]);
        }

        init();

        printf("Case %d:
",t);

        char ope[10];
        while(1){
            scanf("%s",ope);
            if(ope[0]=='E') break;
            int x,y;
            if(ope[0]=='A'){
                scanf("%d%d",&x,&y);
                add(x,y);
            }
            else if(ope[0]=='S'){
                scanf("%d%d",&x,&y);
                add(x,-y);
            }
            else{
                scanf("%d%d",&x,&y);
                int ans=query(x,y);
                printf("%d
",ans);
            }
        }
    }

    return 0;
}
原文地址:https://www.cnblogs.com/fish7/p/4318482.html