输入一个 $n$ 行 $m$ 列的整数矩阵,再输入 $q$ 个操作,每个操作包含五个整数 $x_1, y_1, x_2, y_2, c$,其中 $(x_1, y_1)$ 和 $(x_2, y_2)$ 表示一个子矩阵的左上角坐标和右下角坐标。
每个操作都要将选中的子矩阵中的每个元素的值加上 $c$。
请你将进行完所有操作后的矩阵输出。
输入格式
第一行包含整数 $n,m,q$。
接下来 $n$ 行,每行包含 $m$ 个整数,表示整数矩阵。
接下来 $q$ 行,每行包含 $5$ 个整数 $x_1, y_1, x_2, y_2, c$,表示一个操作。
输出格式
共 $n$ 行,每行 $m$ 个整数,表示所有操作进行完毕后的最终矩阵。
数据范围
$1 \\le n,m \\le 1000$,
$1 \\le q \\le 100000$,
$1 \\le x_1 \\le x_2 \\le n$,
$1 \\le y_1 \\le y_2 \\le m$,
$\-1000 \\le c \\le 1000$,
$\-1000 \\le 矩阵内元素的值 \\le 1000$
输入样例:
3 4 3
1 2 2 1
3 2 2 1
1 1 1 1
1 1 2 2 1
1 3 2 3 2
3 1 3 4 1
输出样例:
2 3 4 1
4 3 4 1
2 2 2 2
思路
这题类似前一题,我们只需将代码稍稍改动即可。
注意这里会有多减的情况,要把他们加回去。
如果还不懂的话,请看这篇博客
代码
#include <iostream>
using namespace std;
const int N = 1010;
int n,m,q;
int a[N][N];
void insert (int x1,int y1,int x2,int y2,int d) {
a[x1][y1] += d;
a[x1][y2 + 1] -= d;
a[x2 + 1][y1] -= d;
a[x2 + 1][y2 + 1] += d;
}
int main () {
cin >> n >> m >> q;
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= m;j++) {
int x;
cin >> x;
insert (i,j,i,j,x);
}
}
while (q--) {
int x1,y1,x2,y2,d;
cin >> x1 >> y1 >> x2 >> y2 >> d;
insert (x1,y1,x2,y2,d);
}
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= m;j++) {
a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
cout << a[i][j] << ' ';
}
puts ("");
}
return 0;
}
太自律了, 每天早上都能刷到你..
hh
a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];这个是什么意思呀 为什么这样算之后可以求出操作之后的矩阵呀?
其实要用两个数组,但我只用了一个
看看这个?
6
3Q