树状数组_二维
class TreeArraryTwo{ public : const static int cmaxn = 1e3+200; int date[cmaxn][cmaxn]; int xsz, ysz; void init(int size_x, int size_y) { xsz = size_x; ysz = size_y; memset(date, 0, sizeof(date)); } inline int lowbit(int idx) { return idx & -idx; } void update(int x, int y, int val) { int i, j; for (i=x; i<=xsz; i+=lowbit(i)) // 注意 y x是相反的 ---> emmmm. for (j=y; j<=ysz; j+=lowbit(j)) date[i][j] += val; } int getsum(int x, int y) { int i, j, res = 0; for (i=x; i>0; i-=lowbit(i)) for (j=y; j>0; j-=lowbit(j)) res += date[i][j]; return res; } /// 书写代码的时候要注意 原点!!!! 不是直接左上角 而是从原点的位置开始弄. /// 下面的代码是原点在左下角的 和我们数学上的笛卡尔坐标系一致. int getsum(int x1, int y1, int x2, int y2) { // return getsum(x2, y1) - getsum(x1-1, y1) - getsum(x2, y2-1) + getsum(x1-1, y2-1); // 给定左上角 右下角 return getsum(x2, y2) - getsum(x1-1, y2) - getsum(x2, y1-1) + getsum(x1-1, y1-1); //左下角 右上角 } };
class TreeArraryTwo{public :const static int cmaxn = 1e3+200;int date[cmaxn][cmaxn];int xsz, ysz;void init(int size_x, int size_y) {xsz = size_x; ysz = size_y;memset(date, 0, sizeof(date));} inline int lowbit(int idx) { return idx & -idx; }void update(int x, int y, int val) {int i, j;for (i=x; i<=xsz; i+=lowbit(i)) // 注意 y x是相反的 ---> emmmm. for (j=y; j<=ysz; j+=lowbit(j)) date[i][j] += val;}int getsum(int x, int y) {int i, j, res = 0;for (i=x; i>0; i-=lowbit(i)) for (j=y; j>0; j-=lowbit(j)) res += date[i][j];return res;}/// 书写代码的时候要注意 原点!!!! 不是直接左上角 而是从原点的位置开始弄. /// 下面的代码是原点在左下角的 和我们数学上的笛卡尔坐标系一致. int getsum(int x1, int y1, int x2, int y2) { //return getsum(x2, y1) - getsum(x1-1, y1) - getsum(x2, y2-1) + getsum(x1-1, y2-1); // 给定左上角 右下角 return getsum(x2, y2) - getsum(x1-1, y2) - getsum(x2, y1-1) + getsum(x1-1, y1-1); //左下角 右上角 }};