H - Grid Filling Editorial
by
rsk0315
黒塗りの矩形をずらしていくのをシミュレーションしていきます。
黒塗りの部分を #
、そうでない部分を .
で表すと、
###..
###..
.....
.....
.###.
.###.
.....
.....
..###
..###
.....
.....
.....
..###
..###
.....
.....
.###.
.###.
.....
.....
###..
###..
.....
.....
.....
###..
###..
.....
.....
.###.
.###.
.....
.....
..###
..###
のように、「右端まで 1 マスずつずらす」「下に 1 マスずらす」「左端まで 1 マスずつずらす」「下に 1 マスずらす」「右端まで〜」というのを繰り返します。
左右にずらしたときは、差分が \(2h\) マス(黒塗りだったのを黒塗りでなくする \(h\) マスと、黒塗りにする \(h\) マス)あり、下にずらしたときは差分が \(2w\) マスあります。
左右のずらしは \((W-w)\times(H-h+1)\) 回、下へのずらしは \((H-h)\) 回発生するため、差分の更新は全部で \(O(H^2W)\) 回です。
差分の管理に際しては、count[x]
:= (黒塗りでない x
の個数) を管理すればよいです。count[x] == 0
の真偽によって答えを更新することで、一つあたり \(O(1)\) 時間で処理できます。
計算量は \(O(H^2W+N)\) 時間です。
「\((k, l) = (i, 0)\) としてから、右端まで 1 マスずつずらす」というのを各 \(i\) について行う方針でも、\(O(HW(H+W)+N)\) 時間で解けそうです。
posted:
last update: