import java.io.*; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(System.out); StringTokenizer st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); int m = Integer.parseInt(st.nextToken()); int q = Integer.parseInt(st.nextToken()); long[][] matrix = new long[n + 1][m + 1]; for (int i = 1; i <= n; i++) { st = new StringTokenizer(br.readLine()); for (int j = 1; j <= m; j++) { matrix[i][j] = Long.parseLong(st.nextToken()); } } long[][] prefix = new long[n + 1][m + 1]; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { prefix[i][j] = matrix[i][j] + prefix[i - 1][j] + prefix[i][j - 1] - prefix[i - 1][j - 1]; } } for (int k = 0; k < q; k++) { st = new StringTokenizer(br.readLine()); int x1 = Integer.parseInt(st.nextToken()); int y1 = Integer.parseInt(st.nextToken()); int x2 = Integer.parseInt(st.nextToken()); int y2 = Integer.parseInt(st.nextToken()); long result = prefix[x2][y2] - prefix[x1 - 1][y2] - prefix[x2][y1 - 1] + prefix[x1 - 1][y1 - 1]; out.println(result); } out.flush(); } }
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:使用 BufferedReader 和 StringTokenizer 高效读取输入数据。
- 矩阵初始化:将输入的矩阵存储在 matrix 数组中,下标从 1 开始。
- 构建前缀和数组:通过递推公式计算每个位置的前缀和,确保每个位置的值正确表示从 (1,1) 到该位置的子矩阵和。
- 处理查询:对于每个查询,使用前缀和数组快速计算子矩阵的和,并利用 PrintWriter 高效输出结果。