今天在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;
}