二维树状数组,update(x,y)是更新(x,y),然后维护(x,y)右下角的矩阵,sum(x,y)是求(1,1) 到 (x ,y)这个矩阵内所有元素的和。当然也可以用来求任意矩阵的值。
例如求矩阵(x1,y1) 到 (x2,y2)的值,那么直接sum (x2, y2) – sum(x1 – 1 ,y2) – sum(x2 ,y1 - 1) + sum (x1 – 1 ,y1 - 1) 即可。
int lowbit(int x )
{
return x & (-x) ;
}
void update(int x ,int y ,int num)
{
for (int i = x ;i <= n ;i += lowbit(i))
for (int j = y ; j <= m ;j += lowbit(j) )
c[i][j] += num ;
}
int sum(int x ,int y )
{
int ans = 0 ;
for (int i = x ;i > 0 ;i -= lowbit(i))
for (int j = y ;j > 0 ; j -= lowbit(j))
ans += c[i][j] ;
return ans ;
}
三维树状数组:
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int y,int z,int num)
{
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j))
for(int k=z;k<=n;k+=lowbit(k))
c[i][j][k]+=num;
}
int Sum(int x,int y,int z)
{
int sum=0;
for(int i=x;i>0;i-=lowbit(i))
for(int j=y;j>0;j-=lowbit(j))
for(int k=z;k>0;k-=lowbit(k))
sum+=c[i][j][k];
return sum;
}
求空间(x1,y1,z1)到(x2,y2,z2)的值:
w=Sum(x2,y2,z2)-Sum(x2,y1-1,z2)-Sum(x2,y2,z1-1)-Sum(x1-1,y2,z2);
w+=Sum(x2,y1-1,z1-1)+Sum(x1-1,y2,z1-1)+Sum(x1-1,y1-1,z2);
w-=Sum(x1-1,y1-1,z1-1);