树状数组 (模版)

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

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

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

代码:

  
    
/* 所谓的树状数组 */
# 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 ;
}

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