はじめに
自分用の備忘録として。
問題
下記のリンクからご確認お願いします。
A08 - Two Dimensional Sum , https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_h
解答例
import java.util.*; class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int H = sc.nextInt(); int W = sc.nextInt(); int[][] table = new int[H + 2][W + 2]; int[][] ruiseki = new int[H + 2][W + 2]; for (int i = 1; i <= H; i++) { for (int j = 1; j <= W; j++) table[i][j] = sc.nextInt(); } int Q = sc.nextInt(); int[] A = new int[Q + 1]; int[] B = new int[Q + 1]; int[] C = new int[Q + 1]; int[] D = new int[Q + 1]; for (int i = 1; i <= Q; i++) { A[i] = sc.nextInt(); B[i] = sc.nextInt(); C[i] = sc.nextInt(); D[i] = sc.nextInt(); } for (int i = 0; i <= H; i++) { for (int j = 0; j <= W; j++) ruiseki[i][j] = 0; } for (int i = 1; i <= H; i++) { for (int j = 1; j <= W; j++) ruiseki[i][j] = ruiseki[i][j - 1] + table[i][j]; } for (int j = 1; j <= W; j++) { for (int i = 1; i <= H; i++) ruiseki[i][j] = ruiseki[i - 1][j] + ruiseki[i][j]; } for (int i = 1; i <= Q; i++) { System.out.println(ruiseki[C[i]][D[i]] + ruiseki[A[i]-1][B[i]-1] - ruiseki[A[i]-1][D[i]] - ruiseki[C[i]][B[i]-1]); } } };
この問題も意外と累積和を計算するテーブルの要素の数をH +2 みたいに、 +2することがポイントだったりします!
参考文献
米田さん、競技プログラミングの鉄則 ~アルゴリズム力と思考力を高める77の技術~ (Compass Booksシリーズ)