import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] line = br.readLine().split(" ");
        int n = Integer.parseInt(line[0]);
        int m = Integer.parseInt(line[1]);
        int q = Integer.parseInt(line[2]);

        long[][] a = new long[n + 2][m + 2];
        for (int i = 1; i <= n; i++) {
            line = br.readLine().split(" ");
            for (int j = 1; j <= m; j++) {
                a[i][j] = Long.parseLong(line[j - 1]);
            }
        }

        long[][] d = new long[n + 2][m + 2];
        for (int t = 0; t < q; t++) {
            line = br.readLine().split(" ");
            int x1 = Integer.parseInt(line[0]);
            int y1 = Integer.parseInt(line[1]);
            int x2 = Integer.parseInt(line[2]);
            int y2 = Integer.parseInt(line[3]);
            int k = Integer.parseInt(line[4]);

            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];
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                sb.append(a[i][j] + d[i][j]);
                if (j < m) {
                    sb.append(" ");
                }
            }
            sb.append("\n");
        }
        System.out.print(sb.toString());
    }
}

https://www.nowcoder.com/discuss/727521113110073344

思路:

  1. 输入处理:使用BufferedReader高效读取输入数据,初始化矩阵和差分数组。
  2. 差分数组更新:对于每个操作,更新差分数组的四个关键点,以表示区域变化。
  3. 前缀和计算:通过两次遍历计算二维前缀和,得到每个位置的总变化量。
  4. 结果生成:将初始矩阵与差分数组的变化量相加,生成最终结果并输出。