算法的实际含义其实就是一维树状数组的展开,其可以参照之前写的树状数组博客
分为两个部分:
1、以下是单点修改,面积区间查询的代码
void change(int i, int j, int delta){
///A[i][j] += delta; 实际上不需要写出A[][]的结构
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;
}
int getsum(int i, int j){
int res = 0;
for(int x = i; x; x -= lowbit(x))
for(int y = j; y; y -= lowbit(y))
res += C[x][y];
return res;
}
2、以下是区间修改,单点查询的代码
change函数与getsum函数没有变化,只是调用的时候以差分思想来调用。
///区间修改
change(a,b,1);
change(a,d+1,-1);
change(c+1,b,-1);
change(c+1,d+1,1);
///单点查询
getsum(a,b);