水题,直接按照差分定义处理所有询问即可,最后跑二维前缀和,加到原数组上输出即可。
#include<bits/stdc++.h>
using i64 = long long;
int main() {
std::cin.tie(nullptr)->sync_with_stdio(false);
int n, m, q;
std::cin >> n >> m >> q;
std::vector a(n + 2, std::vector<i64>(m + 2)), diff = a;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
std::cin >> a[i][j];
}
}
while (q--) {
int sx, sy, ex, ey, x;
std::cin >> sx >> sy >> ex >> ey >> x;
diff[sx][sy] += x;
diff[sx][ey + 1] -= x;
diff[ex + 1][sy] -= x;
diff[ex + 1][ey + 1] += x;
}
for (auto &v : diff) {
std::partial_sum(v.begin(), v.end(), v.begin());
}
for (int j = 0; j <= m; j++) {
for (int i = 1; i <= n; i++) {
diff[i][j] += diff[i - 1][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
std::cout << diff[i][j] + a[i][j] << " ";
}
std::cout << "\n";
}
return 0;
}

京公网安备 11010502036488号