【封装】二维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); } };
你只有十分努力,才能看上去毫不费力。