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