hdu1166---敌兵布阵
tips:
1.c[i]数组每次结束后要清零---update的更新方式决定的(c[i]+=v)
2.c[i]记录的是在i号位之前(含i号位)lowbit(i)个数的和
3.单点更新,区间查询,可以不用lazy标记和线段树
4.对知识的理解是会随着时间的增加而加深的,不过自己要投入思考。
//hdu支持万能头文件 //本来想用线段树呢,结果一直re呀o(╥﹏╥)o //索性就来试试树状数组,毕竟树状数组也是第一写 #include<cstdio> #include<iostream> using namespace std; const int M=50010; int c[M]; int t;int n; int lowbit(int x){ return x&-x; } void update(int x,int v){ for(int i=x;i<=n;i+=lowbit(i)){ c[i]+=v; } } int getsum(int x){ int sum=0; for(int i=x;i>0;i-=lowbit(i)){ sum+=c[i]; } return sum; } int main(){ scanf("%d",&t); int xu=1; while(t--){ scanf("%d",&n); fill(c,c+n+1,0);//没有这个会wa这是为什么呢 //知道了,采用的update的更新方式,如果不清零,会有上次的影响 for(int i=1;i<=n;i++){ int v; scanf("%d",&v); update(i,v); } c[0]=0; char p[10] ; int x,y; printf("Case %d:\n",xu++); while(cin>>p && p[0]!= 'E'){ //if(p[0]=='E') break; cin>>x>>y; if(p[0] == 'Q'){ printf("%d\n",getsum(y)-getsum(x-1)); } if(p[0]== 'A'){ update(x,y); } if(p[0] == 'S'){ update(x,-y); } } } return 0; }