有图知前n项和等于a[1] + .....+ a[n] ,同时也等于不大于n的各二叉树的根结点之和。
i-lowbit(i)也即i-2^k就是i的前一个二叉树的根结点。前n项和是要求出n之前的所有二叉树的根结点。
代码如下:
int sumn(int i)
{
int sum = 0 ;
while(i > 0)
{
sum += a[i] ;
i = i - lowbit(i) ;
}
return sum ;
}
好了,树状数组就此结束。下面是完整的代码:
#include <iostream>
using namespace std;
#define MAXN 50
int c[MAXN] ;
int a[MAXN] ;
int n ;
int lowbit(int i)
{
return i & (i ^ (i - 1)) ;
}
void sumc(int i)
{
while(i <= n)
{
c[i] += a[i] ;
i = i + lowbit(i);
}
}
int sumn(int i)
{
int sum = 0 ;
while(i > 0)
{
sum += a[i] ;
i = i - lowbit(i) ;
}
return sum ;
}
void init()
{
for(int i = 0; i < MXAN ; i ++)
c[i] = 0 ;
}
int main()
{
init() ;
for(int i = 1; i <= n; i ++)
{
cin >> a[i] ;
sumc(i);
}
return 0 ;
}