去年的暑假集训的时候,也看了下树状数组,那时候没学会就放下了,前两天下载一个课件又好好的看下,感觉也理解了一点 ^_^...

使用树状数组局感觉限性不小, 只有进行特殊的 题目才比较实用,  对一般的题目还是用线段树的好。。

以后坚持每天都写一篇博客吧,记录下每天的心得 ^_^

代码:

/*所谓的树状数组*/
# include
<stdio.h>
int a[20],m;
int Lowbit(int n)
{
return n&(n^(n-1));/// 2的k次幂==n&(n^(n-1)) ( ^ 是异或的意思,) k表示把n转化为2进制后 后面的0的个数
}
int sum(int n)
{
int ans=0;
while(n>0)
{
ans
+=a[n];
n
-=Lowbit(n);
}
return ans;
}
void puls(int pos,int num)
{
while(pos<=10)
{
a[pos]
+=num;
pos
+=Lowbit(pos);
}
}
int main()
{
int i,b[20],j,pos,num;
for(i=1;i<=10;i++)
scanf(
"%d",&b[i]);
for(i=1;i<=10;i++)
{
a[i]
=0;
for(j=i-Lowbit(i)+1;j<=i;j++)
a[i]
+=b[j];
}
scanf(
"%d%d",&pos,&num);
puls(pos,num);// 第pos位上的数字增加num
while(scanf("%d",&m)!=EOF)
{
printf(
"%d\n",sum(m));//求前m项的和
}
return 0;
}
posted on 2011-03-22 12:20  奋斗青春  阅读(483)  评论(0编辑  收藏  举报