看了半天树状数组,感觉到其神奇,但没懂其原理,先贴个模板,带我细细研究...⊙﹏⊙b
/*
一定要注意数组c的初始化,N是数组的大小,modify的功能是把第n个元素加上delta,
而sum的功能则是求从第一个元素开始到第n个元素之和,当然也可以求一段区间上的和,
比如我要求第x个元素到第y个元素的和,答案就是sum(y) - sum(x - 1)
*/
#include <iostream>
using namespace std;
int N,c[1000],a[10];
int lowbit( int n )
{
return n & (-n);
}
void modify( int n, int delta )
{
while ( n <= N )
{
c[n] += delta;
n += lowbit(n);
}
}
int sum( int n )
{
int ret = 0;
N=10;
while ( n != 0 )
{
ret += c[n];
n -= lowbit(n);
}
return ret;
}
int main()
{
for(int i=1;i<=10;i++)
{
modify(i,i);
}
cout<<sum(4)<<endl;
return 0;
}