【封装】二维BIT

struct BIT{
    #define maxn 1000

    int n, m;
    int d1[maxn][maxn], d2[maxn][maxn], d3[maxn][maxn], d4[maxn][maxn], c[maxn][maxn];

    inline void init(int x, int y) { n = x, m = y; }
    inline int lowbit(int &x) { return x & -x; }

    void modify(int x, int y, int p){
        for(int i = x; i <= n; i += lowbit(i))
            for(int t = y; t <= m; t += lowbit(t)){
                d1[i][t] += p,  d2[i][t] += p*y;
                d3[i][t] += p*x,  d4[i][t] += p*x*y;
                // 单点修改写法:c[i][t] += p;
            }
    }

    void Modify(int x1, int y1 ,int x2, int y2, int p){ 
        modify(x1, y1, p),  modify(x1, y2 + 1, -p);
        modify(x2 + 1, y1, -p),  modify(x2 + 1, y2 + 1, p);
    }

    int query(int x,int y){
        int ans = 0;
        for(int i = x; i; i -= lowbit(i))
            for(int t = y; t; t -= lowbit(t)){
                ans += (x + 1) * (y + 1) * d1[i][t];
                ans -= (x + 1) * d2[i][t] + (y + 1) * d3[i][t];
                ans += d4[i][t];
                // 单点修改对应查询:ans += c[i][t];
            }
        return ans;
    }

    int Query(int x1, int y1, int x2, int y2){
        return query(x2, y2) + query(x1 - 1, y1 - 1) - query(x1 - 1, y2) - query(x2, y1 - 1);
    }
};
你只有十分努力,才能看上去毫不费力。
原文地址:https://www.cnblogs.com/214txdy/p/14023966.html