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