【累積和メニュー】> FINAL問題【二次元累積和】 二次元累積和 7 (paizaランク C 相当) [難易度: 1417 ±42]
※リンク先へ移動するためには[paiza]へのログインが必要です。
1 行目に整数 N, M, Q が与えられます。
2 行目以降に N 行 M 列の整数の二次元配列 A が与えられます。
2 + N 行目以降に Q 行に渡って整数 a_i, b_i, c_i, d_i (0 ≦ i ≦ Q - 1) が与えられます。
A の j 行目 k 列目を A_{j, k} (0 ≦ j ≦ N - 1, 0 ≦ k ≦ M - 1) と表すことにします。
i 番目の長方形領域の左上の要素を A_{a_i, b_i}, 右下の要素を A_{c_i, d_i} としたとき、これら Q 個の長方形領域内の整数の和を累積和を用いて求め、改行区切りで出力してください。
入力値(例)
5 5 3
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
1 1 3 3
2 2 4 4
0 0 2 2
出力値(例)
45
63
27
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php list($n, $m, $q) = explode(" ", trim(fgets(STDIN))); for ($i=0; $i<$n; $i++) { $a[$i] = explode(" ", trim(fgets(STDIN))); } //print_r($a); $h = $n; $w = $m; $sRow = array_fill(0, $w+1, 0); $s = array_fill(0, $h+1, $sRow); for ($i=0; $i<$h; $i++) { for ($j=0; $j<$w; $j++) { $s[$i+1][$j+1] = $a[$i][$j]+$s[$i][$j+1]+$s[$i+1][$j]-$s[$i][$j]; } } for ($i=0; $i<$q; $i++) { list($ax, $by, $cx, $dy) = explode(" ", trim(fgets(STDIN))); $sy = $ax; $sx = $by; $ly = $cx; $lx = $dy; $ans = $s[$ly+1][$lx+1]-$s[$sy][$lx+1]-$s[$ly+1][$sx]+$s[$sy][$sx]; echo $ans. "\n"; } ?> |