[アルゴリズム]伯俊>#16507.暗闇が怖くて

1677 ワード

質問リンク
白駿#16507。暗闇が怖くて
解答方法
毎回区間と平均を求めると当然タイムアウトになるでしょう?なので区間組み合わせ配列を使いました!sumtable[r][C]の値はsumtable[1]からsumtable[r][C]の輝度までの和である.この区間組合せ配列を利用して、1時間で区間平均輝度を求めることができます~これは簡単な問題です!
int area = sumTable[r2][c2] - (sumTable[r1 - 1][c2] + sumTable[r2][c1 - 1] - sumTable[r1 - 1][c1 - 1]);
area /= ((r2 - r1 + 1) * (c2 - c1 + 1));
コード#コード#
import java.util.*;
public class BOJ16507 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int r = sc.nextInt();
        int c = sc.nextInt();
        int q = sc.nextInt();

        int[][] sumTable = new int[r + 1][c + 1];
        for (int i = 0; i <= c; i++) sumTable[0][i] = 0;
        for (int i = 1; i <= r; i++) sumTable[i][0] = 0;

        for (int i = 1; i <= r; i++) {
            for (int j = 1; j <= c; j++) {
                sumTable[i][j] = sumTable[i][j - 1] + sumTable[i - 1][j] + sc.nextInt() - sumTable[i - 1][j - 1];
            }
        }

        StringBuilder result = new StringBuilder();
        while ((--q) >= 0) {
            int r1 = sc.nextInt();
            int c1 = sc.nextInt();
            int r2 = sc.nextInt();
            int c2 = sc.nextInt();

            int area = sumTable[r2][c2] - (sumTable[r1 - 1][c2] + sumTable[r2][c1 - 1] - sumTable[r1 - 1][c1 - 1]);
            area /= ((r2 - r1 + 1) * (c2 - c1 + 1));
            result.append(area);
            result.append("\n");
        }

        System.out.print(result.toString());
    }
}