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;
}
原意是有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;
}