码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-03-06 16:28:52      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

题意:

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:\n",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\n",ans);
            }
        }
    }

    return 0;
}

 

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

标签:

原文地址:http://www.cnblogs.com/fish7/p/4318482.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!