树状数组

  树状数组是一个很简单好用的数据结构。

  功能主要:区间求和,更新大小。

  我们只要把原来的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;
}

 

你可能感兴趣的:(树状数组)