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 高效输出结果。



京公网安备 11010502036488号