taiPyのお悩み解決ブログ

日々の発見をまとめます!

Javaの解答例:A08 - Two Dimensional Sum , 競技プログラミングの鉄則 演習問題集

はじめに

自分用の備忘録として。

問題

下記のリンクからご確認お願いします。

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シリーズ)