【クエリメニュー】> 【点の幅】STEP: 2 ドーナツ (paizaランク A 相当) [難易度: 1927 ±36]
※リンク先へ移動するためには[paiza]へのログインが必要です。
あなたはドーナツ屋 paiza の店員です. この店では, チョコが埋め込まれた四角のドーナツが名物となっています.
H x W cm^2 の生地があります. これは 1 cm^2 ごとに区画されており, H x W 個の区画を持っています.
また, それぞれの区間には既にいくつかのチョコが散りばめられています.
この 1 枚の生地から四角いドーナツの形を 1 つ切り出すことができます.
具体的には次の工程をおこないます.
1. 上から y 番目、 左から x 番目の区間を中心に一辺が B cm の正方形の切れ目を入れる。
2. 上から y 番目、 左から x 番目の区間を中心に一辺が S cm の正方形の切れ目を入れることでドーナツ状の切れ目を完成させる。(S < B であることが保証されています)
生地を成す H*W 個の各区画について、その区画に含まれるチョコの数と、作る N 個のドーナツについての情報が与えられるので、各ドーナツにチョコがいくつ含まれることになるかを求めてください。
なお、 N 枚の生地について、含まれるチョコの分布は全て同じであることがわかっています。
例として、入力例 1 では、生地は 3 × 3 cm^2 であり、次の通り区画されています。
このドーナツに乗っているチョコの数は 40 個であるので、答えとして 40 を出力してください。
入力値(例)
3 3 1
1 2 3
4 5 6
7 8 9
2 2 3 1
出力値(例)
40
解答例
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 28 29 30 31 32 33 34 35 36 |
<?php list($h, $w, $n) = explode(" ", trim(fgets(STDIN))); for ($i=0; $i<$h; $i++) { $a[] = explode(" ", trim(fgets(STDIN))); for ($j=0; $j<$w; $j++) { $sum[$i][$j] = $a[$i][$j]; if ($i>0) $sum[$i][$j] += $sum[$i-1][$j]; if ($j>0) $sum[$i][$j] += $sum[$i][$j-1]; if ($i>0 && $j>0) $sum[$i][$j] -= $sum[$i-1][$j-1]; } } //print_r($sum); for ($i=0; $i<$n; $i++) { list($y, $x, $b, $s) = explode(" ", trim(fgets(STDIN))); $y--; $x--; $ans = $sum[$y+$b/2][$x+$b/2]; if ($y+$b/2-$b>=0) $ans-=$sum[$y+$b/2-$b][$x+$b/2]; if ($x+$b/2-$b>=0) $ans-=$sum[$y+$b/2][$x+$b/2-$b]; if ($y+$b/2-$b>=0 && $x+$b/2-$b>=0) $ans+=$sum[$y+$b/2-$b][$x+$b/2-$b]; $ans-=$sum[$y+$s/2][$x+$s/2]; if ($y+$s/2-$s>=0) $ans+=$sum[$y+$s/2-$s][$x+$s/2]; if ($x+$s/2-$s>=0) $ans+=$sum[$y+$s/2][$x+$s/2-$s]; if ($y+$s/2-$s>=0 && $x+$s/2-$s>=0) $ans-=$sum[$y+$s/2-$s][$x+$s/2-$s]; printf("%d\n", $ans); } ?> |