树状数组_二维

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

猜你喜欢

转载自www.cnblogs.com/cgjh/p/9348993.html
今日推荐