TreeArray1195

题意:要求设计这样一个数据结构,支持下列操作

1.add(x,y,a).对二维数组的第x行,第y列加上a.

2.sum(l,b,r,t).求所有满足l<=x<=r,b<=y<=t,的数组元素的和.

显然,二维树状数组满足这些要求.

一维树状数组很容易扩展到二维,在二维情况下:数组A[][]的树状数组定义为:

C[x][y] = ∑ a[i][j], 其中,

x-lowbit(x) + 1 <= i <= x,

y-lowbit(y) + 1 <= j <= y.

在二维情况下,如果修改了A[i][j]=delta,则对应的二维树状数组更新函数为:

因为c[x][y]是以下节点的子节点:

c[x][y+lowbit(y)],c[x][y+2*lowbit(y)],c[x][y+3*lowbit(y)].... c[x][y+lengthy]

c[2*x][y+lowbit(y)],c[2*x][y+2*lowbit(y)].....

private void Modify(int i, int j, int delta)

{

A[i][j]+=delta;

for(int x = i; x< A.length; x += lowbit(x))

for(int y = j; y <A[i].length; y += lowbit(y)){

C[x][y] += delta;

}

}

求子矩阵元素之和∑ a[i][j](前i行和前j列)的函数为

int Sum(int i, int j){

int result = 0;

for(int x = i; x > 0; x -= lowbit(x)) {

for(int y = j; y > 0; y -= lowbit(y)) {

result += C[x][y];

}

}

return result;

}

[1...x][1...y]=

[x-low(x)...x][y-low[y]...y]+[x-low(x)...x][y-low(y)-low[y-low(y)]...y-low(y)]......

时间: 2024-08-27 03:12:23

TreeArray1195的相关文章