1. 程式人生 > >樹狀數組_二維

樹狀數組_二維

val date 右上角 int lowbit mmm bsp code span

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); //左下角 右上角 }};

樹狀數組_二維