思路
代码
- 假想有个差分数组,其前缀和就是元素组,这2个数组的值都可以认为是差分得到的
- 画图分析加上减去了哪些部分
- 只需要利用差分数组4个变量变化 省去了一一枚举
//差分只需要考虑如何更新 不需要考虑如何构造
#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;
scanf("%d%d%d", &n, &m, &q);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
scanf("%d", &a[i][j]);
//假定初始时数组都是空的 只需要做插入操作变成真正初始状态
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; 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];
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
{
printf("%d ", b[i][j]);
}
puts("");
}
return 0;
}