题解 | 【模板】二维前缀和
【模板】二维前缀和
https://www.nowcoder.com/practice/99eb8040d116414ea3296467ce81cbbc
开局没考虑好0行0列不应该存值,只能拿try防御一下了
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { private static long safeGet(long[][] num, int i, int j){ try{ return num[i][j]; }catch(Exception e){ return 0; } } public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int m = in.nextInt(); int q = in.nextInt(); long[][] input = new long[n][m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { input[i][j] = in.nextInt(); } } long[][] dp = new long[n][m]; dp[0][0] = input[0][0]; for (int i = 1; i < n; i++) dp[i][0] = input[i][0]+dp[i-1][0]; for (int j = 1; j < m; j++) dp[0][j] = input[0][j]+dp[0][j-1]; for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { dp[i][j] = dp[i][j - 1] + dp[i - 1][j] + input[i][j] - dp[i - 1][j - 1]; } } //操作开始 int x1, x2, y1, y2; for (int i = 0; i < q; i++) { x1 = in.nextInt() - 1; y1 = in.nextInt() - 1; x2 = in.nextInt() - 1; y2 = in.nextInt() - 1; long a = dp[x2][y2]; long b = 0, c = 0, d = 0; b = safeGet(dp,x2,y1 - 1); c = safeGet(dp,x1-1,y2); d = safeGet(dp,x1-1,y1 - 1); System.out.println(a - b - c + d); } } }