int lowbit(int x)//计算更新需要的增量
{
return x&(-x);//return x&(x^(x-1))
}
一维树状数组:
局限性:只适用于对点更新和对区间查询; 如果对求区间最值不能用,得用线段树;如果要进行区间的更新和点的查询,可以将Update() 和sum()的内部更新顺序转变,但此时c[]数已不是定义的树状数组了。
void add(int pos,int num,int N)//a[pos]的值增加num Update a:1-N
{
while(pos<=N)//自下向上更新
{
c[pos]+=num;
pos+=lowbit(pos);
}
}
int sum(int end)//[1,end]区间之和
{
int sum=0;
while(end>0)//从上向下更新
{
sum+=c[end];
end-=lowbit(end);
}
return sum;
}
二维树状数组:
void Update(int i,int j,int k,int N)//a[i][j]加上k后对区间的更新
{
for(i<=N)
{
int tem=j;
while(tem<=N)//与一维一样 自下向上 先j后i
{
c[i][tem]+=k;
tem+=lowbit(tem);
}
i+=lowbit(i);
}
}
int sum(int i,int j)//SUM=sum(x2,y2)-sum(x1-1,y2)-[sum(x2,y1-1)-sum(x1-1,y1-1)]
{
int sum=0;
while(i>0)
{
int tem=j;
while(tem>0)
{
sum+=c[i][tem];
tem-=lowbit(tem);
}
i-=lowbit(i);
}
return sum;
}
详细讲解:http://www.cnblogs.com/zhangshu/archive/2011/08/16/2141396.html
http://blog.csdn.net/int64ago/article/details/7429868