1. 程式人生 > 其它 >二維差分樹狀陣列

二維差分樹狀陣列

仿照一維樹狀陣列的搭建可搭建二維樹狀陣列,在二維樹狀陣列的基礎上再搭建二維差分樹狀陣列。

#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);
}