二维前缀和


题目:子矩阵的和

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
final int MAXN = 1011;
int[][] a = new int[MAXN][MAXN];
int[][] s = new int[MAXN][MAXN];
int n = sc.nextInt();
int m = sc.nextInt();
int q = sc.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
a[i][j] = sc.nextInt();
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
s[i][j] = s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1] +a[i][j];
}
}
while (q-- > 0) {
int x1 = sc.nextInt();
int y1 = sc.nextInt();
int x2 = sc.nextInt();
int y2 = sc.nextInt();
int res = s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1];
System.out.println(res);
}
sc.close();
}