您的位置:首页 > 其它

HDU 1166 敌兵布阵

2016-07-19 19:44 295 查看
题意:

原意是有n个阵地,每次可以向某个阵地加、减人,还能问你l~r阵地的士兵总人数。

思路:

线段树,单点更新,区间求和。

#include<cstdio>
#include<cstring>

const int MAX=50005;
int sum[MAX<<2];

void PushUp(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}

void Build(int l,int r,int rt){
sum[rt]=0;
if(l==r){
scanf("%d",&sum[rt]);
return;
}
int mid=(l+r)>>1;
Build(l,mid,rt<<1);
Build(mid+1,r,rt<<1|1);
PushUp(rt);
}

void UpDate(int pos,int c,int l,int r,int rt){
if(l==r){
sum[rt]+=c;
return;
}
int mid=(l+r)>>1;
if(pos<=mid) UpDate(pos,c,l,mid,rt<<1);
else UpDate(pos,c,mid+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 res=0;
int mid=(l+r)>>1;
if(L<=mid) res+=Query(L,R,l,mid,rt<<1);
if(mid<R) res+=Query(L,R,mid+1,r,rt<<1|1);
return res;
}

int main(){
int T,cas=1;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
Build(1,n,1);
char op[10];
int i,j;
printf("Case %d:\n",cas++);
while(~scanf("%s",op)&&op[0]!='E'){
scanf("%d%d",&i,&j);
if(op[0]=='A') UpDate(i,j,1,n,1);
if(op[0]=='S') UpDate(i,-j,1,n,1);
if(op[0]=='Q') printf("%d\n",Query(i,j,1,n,1));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: