标签:
树状数组是一个很简单好用的数据结构。
功能主要:区间求和,更新大小。
我们只要把原来的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