二维树状数组就是求矩阵和。
一维树状数组中:C[1] = a1, C[2] = a1 + a2, C[3] = a3;
记:
B[1]={a11,a11+a12,a13,a11+a12+a13+a14,a15,a15+a16,…} 这是第一行的一维树状数组
B[2]={a21,a21+a22,a23,a21+a22+a23+a24,a25,a25+a26,…} 这是第二行的一维树状数组
则C[1][1] = a11, C[1][2] = a11 + a12, C[1][3] = a13;类比一维,可知C[i][]就是第 i 行的一维树状数组。
则C[1][1] = a11, C[2][1] = a11 + a21, C[3][1] = a31;类比一维,可知C[][j]就是第 j 列的一维树状数组。
https://blog.csdn.net/cggwz/article/details/78420102:上面的详细版本。
http://www.cnblogs.com/RabbitHu/p/BIT.html:树状数组的集合。神犇
//关键在于理解C[i][]是第i行的一维树状数组,C[][j]是第j列的树状数组
#define lowbit(x) x&(-x)
void update(int x, int y, int d)
{
while(x < maxn)
{
int i = y;
while(i < maxm)
{
C[x][i] += d;
i += lowbit(i);
}
x += lowbit(x);
}
}
int sum(int x, int y)//求左上角为(1,1)右下角为(x,y) 的矩阵和
{
int res = 0;
while(x > 0)
{
int i = y;
while(i > 0)
{
res += C[x][i];
i -= lowbit(i);
}
x -= lowbit(x);
}
}
//求(x0,y0)到(x,y)的矩阵和就是做差分了