二维差分
- 构造差分时,在读入矩阵元素时同时构建差分
- 即最初差分矩阵是一个全零矩阵的差分
- 读入一个元素时,差分矩阵随即更新
- 即该数组是一个含有已读入元素的矩阵的差分矩阵
- 随后对于区间累加,执行相应操作,因为当前矩阵已经是构造好的差分矩阵,直接在该矩阵上操作
- 最后还原成原矩阵,使用二维前缀和进行还原

#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> matrix;
void insert(int x1, int y1, int x2, int y2, int c)
{
matrix[x1][y1] += c;
matrix[x1][y2 + 1] -= c;
matrix[x2 + 1][y1] -= c;
matrix[x2 + 1][y2 + 1] += c;
}
int main()
{
int m, n, k;
cin >> m >> n >> k;
matrix.resize(m + 2, vector<int>(n + 2));
for(int i = 1; i <= m; ++i)
{
for(int j = 1; j <= n; ++j)
{
int c;
cin >> c;
insert(i, j, i, j, c);
}
}
for(int i = 0; i < k; ++i)
{
int x1, y1, x2, y2, c;
cin >> x1 >> y1 >> x2 >> y2 >> c;
insert(x1, y1, x2, y2, c);
}
for(int i = 1; i <= m; ++i)
{
for(int j = 1; j <= n; ++j)
{
matrix[i][j] = matrix[i - 1][j] + matrix[i][j - 1] - matrix[i - 1][j - 1] + matrix[i][j];
cout << matrix[i][j] << " ";
}
cout << endl;
}
return 0;
}
二维前缀和
