树状数组入门模板题:敌兵布阵
这是一道非常简单的入门模板题
涉及到了 树状数组的 单点修改 以及 区间求和
至于树状数组的具体原理 即理解 见博客:
树状数组入门及例题题解(一)
代码如下:
#include<cstdio>
#include<cstring>
using namespace std;
int n,a,c[50010];
char ch[10];
int lowbit(int x){
return x&(-x);
}
int get_sum(int end){
//求1 到 end 的和
int sum=0;
while(end){
sum+=c[end];
end-=lowbit(end);
}
return sum;
}
int getSum(int start,int end){
return get_sum(end)-get_sum(start);
}
int main(){
int t,k,cnt=0;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++){
scanf("%d",&a);
//来更新c
k=i;
while(k<=n){
c[k]+=a;
k+=lowbit(k);
}
}
int p,q,qes=0,sum;
printf("Case %d:\n",++cnt);
getchar();
while(scanf("%s",&ch)&&ch[0]!='E'){
scanf("%d%d",&p,&q);
//printf("(%c %d %d)\n",ch[0],p,q);
if(ch[0]=='A'){
//a[p]+=q;
//来更新c
while(p<=n){
c[p]+=q;
p+=lowbit(p);
}
}
else if(ch[0]=='S'){
//a[p]-=q;
//来更新c
while(p<=n){
c[p]-=q;
p+=lowbit(p);
}
}
else if(ch[0]=='Q'){
printf("%d\n",getSum(p-1,q));
}
getchar();
}
}
return 0;
}