标签:
树状数组是一个很简单好用的数据结构。
功能主要:区间求和,更新大小。
我们只要把原来的a数组通过不断update到c数组(即树状数组),之后就可以通过O(longn)的复杂度进行查询和更新了。
hdu1166为模板题。
#include <cstdio> #include <cstring> #define FOR(i,x,y) for(int i=x;i<=y;++i) int n,m,temp,x,y,c[50010]; char s[10]; int lowbit(int k) { return k&(-k); } int sum(int k)//求和 { int ans=0; while(k) { ans+=c[k]; k-=lowbit(k); } return ans; } void update(int k,int change)//更新 { while(k<=n) { c[k]+=change; k+=lowbit(k); } } int main() { scanf("%d",&m); FOR(t,1,m) { memset(c,0,sizeof(c)); printf("Case %d:\n",t); scanf("%d",&n); FOR(i,1,n) { scanf("%d",&temp); update(i,temp); } while(scanf("%s",s)&&s[0]!=‘E‘) { scanf("%d%d",&x,&y); if(s[0]==‘Q‘) printf("%d\n",sum(y)-sum(x-1)); else if(s[0]==‘A‘) update(x,y); else update(x,-y); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/cons/p/5204779.html