我们需要处理一个矩阵的多次子矩阵加法操作。直接对每个子矩阵元素逐个加k的方法在q很大时会很慢(O(qnm))。为了高效处理,可以使用二维差分数组的方法,将每次子矩阵加k的操作转换为对差分数组的四个角的操作(O(1)),最后通过计算差分数组的前缀和来得到最终矩阵(O(n*m))。
#include <iostream>
using namespace std;
long long a[1002][1002]; // 原矩阵
long long d[1002][1002]; // 差分数组
int main() {
int n, m, q;
cin >> n >> m >> q;
// 读取原矩阵
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
// 处理每个操作
while (q--) {
int x1, y1, x2, y2, k;
cin >> x1 >> y1 >> x2 >> y2 >> k;
d[x1][y1] += k;
d[x1][y2+1] -= k;
d[x2+1][y1] -= k;
d[x2+1][y2+1] += k;
}
// 计算前缀和得到最终矩阵
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
d[i][j] += d[i-1][j] + d[i][j-1] - d[i-1][j-1];
a[i][j] += d[i][j];
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
#牛客春招刷题训练营# +https://www.nowcoder.com/discuss/726480854079250432



京公网安备 11010502036488号