二维树状数组,顾明思义,其实就是树状数组的二维形式。
主要运用:
1.单点更新
2.子矩阵求和
其中getSum求的是矩阵从(1,1)到(x,y)这个矩阵的和,如果我们需要求某个子矩阵的和,那么
res=getSum(x2,y2)+getSum(x1-1,y1-1)-getSum(x2,y1-1)-getSum(x1-1,y2)
注意矩阵的赋值是数组从1开始的,由于他是二维的树状数组,和一维的差不多。
建树;
void add(int i,int j,int data)
{
for(int x = i; x<=n; x += lowbit(x))
for(int y = j; y <=n; y += lowbit(y))
tr[x][y] += data;
}
求和:
int getsum(int i,int j)
{
int sum=0;
for(int x = i; x>0; x -= lowbit(x))
for(int y = j; y >0; y -= lowbit(y))
sum += tr[x][y];
return sum;
}
完结