分析:
二维矩阵的差分较一维来讲会比较抽象,需要理解下面这个求和公式,与子矩阵的和 仍是逆运算。
差分矩阵可以帮我们快速的处理某种操作,例如给定一个
(
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
)
((x1,y1),(x2,y2))
((x1,y1),(x2,y2)) 区间,让我们在
a
a
a 矩阵的该区间(块)内全都加上某个数
C
C
C,暴力遍历
a
a
a 矩阵的话需要
O
(
n
2
)
O(n^2)
O(n2),我们可以改为对差分矩阵
b
b
b 进行操作,使降为
O
(
1
)
O(1)
O(1)。
代码(C++)
#include <iostream>
using namespace std;
const int N = 1010;
int a[N][N], b[N][N];
void insert(int x1, int y1, int x2, int y2, int c)
{
b[x1][y1] += c;
b[x2 + 1][y1] -= c;
b[x1][y2 + 1] -= c;
b[x2 + 1][y2 + 1] += c;
}
int main()
{
int n, m, q;
cin >> n >> m >> q;
for (int i = 1; i <= n; i ++)
{
for (int j = 1; j <= m; j ++)
{
scanf("%d", &a[i][j]);
insert(i, j, i, j, a[i][j]);
}
}
while (q --)
{
int x1, y1, x2, y2, c;
cin >> x1 >> y1 >> x2 >> y2 >> c;
insert(x1, y1, x2, y2, c);
}
for (int i = 1; i <= n; i ++)
{
for (int j = 1; j <= m; j ++)
{
b[i][j] += b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];
cout << b[i][j] << ' ';
}
cout << endl;
}
}