二維差分樹狀陣列
阿新 • • 發佈:2021-10-04
仿照一維樹狀陣列的搭建可搭建二維樹狀陣列,在二維樹狀陣列的基礎上再搭建二維差分樹狀陣列。
#include<iostream> #define N 100 using namespace std; int n, m; int a[N][N],c[N][N]; int tree[N][N]; int lowbit(int x) { return x & -x; } void change(int x, int y, int v) { int ty = y; for (x; x <= n; x += lowbit(x)) for (y=ty; y <= m; y += lowbit(y)) tree[x][y] += v; } void add(int x1, int y1, int x2, int y2, int v) { change(x1, y1, v); change(x2 + 1, y1, -v); change(x1, y2 + 1, -v); change(x2 + 1, y2 + 1, v); } int ask(int x, int y) { int res = 0; int ty = y; for (x; x > 0; x -= lowbit(x)) for (y=ty; y > 0; y -= lowbit(y)) res += tree[x][y]; return res; } void set() { for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) for (int k = i - lowbit(i) + 1; k <= i; k++) for (int q = j - lowbit(j) + 1; q <= j; q++) tree[i][j] += c[k][q]; } int main() { cin >> n >> m; for(int i=1;i<=n;i++) for (int j = 1; j <= m; j++) { cin >> a[i][j]; c[i][j] = a[i][j] - a[i - 1][j] - a[i][j - 1] + a[i - 1][j - 1]; } set(); add(2, 2, 4, 4, 2); cout << ask(3, 3); }