HDU1166 - 敌兵布阵
题目大意
给定N个数,可以对这些数进行三种操作:
1、Add(i,x),对第i个数增加x
2、Sub(i,x),对第i个数减x
3、Query(x,y) ,查询区间[x,y]的和
题解
赤裸裸的树状数组啊。。。我还二逼得WA了两次,原因是读入字符串的时候用的while(cin>>s),然后就一直不能退出循环了,不知道为啥会这样。。。换成C语言风格的字符串,然后用scanf读入就没问题了。。尼玛坑爹啊。。。
代码:
#include<iostream> #include<cstdio> #include<cstring> #define MAXN 50005 using namespace std; int c[MAXN]; int n; int lowbit(int x) { return x&-x; } void add(int x,int d) { while(x<=n) { c[x]+=d; x+=lowbit(x); } } int sum(int x) { int ret=0; while(x>0) { ret+=c[x]; x-=lowbit(x); } return ret; } int main(void) { int i,j,T,x,y,p=0; char s[10]; cin>>T; while(T--) { printf("Case %d:\n",++p); scanf("%d",&n); memset(c,0,sizeof(c)); for(i=1; i<=n; i++) { scanf("%d",&j); add(i,j); } while(scanf("%s",s)!=EOF) { if(s[0]=='E') break; scanf("%d%d",&x,&y); if(s[0]=='Q') printf("%d\n",sum(y)-sum(x-1)); else if (s[0]=='A') add(x,y); else add(x,-y); } } return 0; }