二维差分树状数组
仿照一维树状数组的搭建可搭建二维树状数组,在二维树状数组的基础上再搭建二维差分树状数组。
#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);
}

浙公网安备 33010602011771号