H - Grid Filling 解説 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)\) 時間です。

提出 #36622723


\((k, l) = (i, 0)\) としてから、右端まで 1 マスずつずらす」というのを各 \(i\) について行う方針でも、\(O(HW(H+W)+N)\) 時間で解けそうです。

投稿日時:
最終更新: