我们需要处理一个矩阵的多次子矩阵加法操作。直接对每个子矩阵元素逐个加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