hdu 1166 敌兵布阵(裸树状数组)

来源:互联网 发布:人民币汇率波动率数据 编辑:程序博客网 时间:2024/05/28 05:13
今天在LRJ的 训练之南里看到了树状数组 原来还有个名字叫 二叉索引树 于是看了一下 加深了对数组数组的理解 遂把以前写的BIT题温习一下 然后敲那道困扰了我还就的 ping pong

题目太啰嗦了。。。题意是给出n 然后n个整数 是初始值 四种命令 add sub query end
end就是命令结束了
这就是纯纯的BIT了。
#include<stdio.h>#include<string.h>#define lowbit(t) (t&(-t))const int maxn=50005;int sum[maxn];int c[maxn];int N;void add(int n,int num){    while(n<=N)    {        c[n]+=num;        n+=lowbit(n);    }}int q(int a){    int sum=0;    while(a)    {        sum += c[a];        a-=lowbit(a);    }    return sum;}int main(){    int T;scanf("%d",&T);    int i,ans,n,a,b,ca=1;    char str[20];    for(i=1;i<=10;++i)    printf("%d ",i-lowbit(i));   // printf("\n");    while(T--)    {        scanf("%d",&N);        printf("Case %d:\n",ca++);        sum[0]=c[0]=0;        for(i=1;i<=N;++i)        {            scanf("%d",&a);            sum[i]=sum[i-1]+a;            c[i]=sum[i]-sum[i-lowbit(i)];        }        while(scanf("%s",str),strcmp(str,"End"))        {            scanf("%d %d",&a,&b);            if(str[0]=='Q')            {                ans= q(b)-q(a-1);                printf("%d\n",ans);            }            else            {                if(str[0]=='S') b=-b;                add(a,b);            }        }    }    return 0;}