remaked mine sweeper

2 secs 1024 MB
nikoro1024's icon nikoro1024

●STEP1
制約式の「H×Wは3で割り切れない」より
H×W≡1,2(mod3) ⇔H≡1,2(mod3),W≡1,2(mod3)と同値変形可能です。

●STEP2
まず一次元の場合の解法を考えてみましょう。
以下のような問題を考えてみます。
AjA_{j}=Bj1B_{j-1}+BjB_{j}+Bj+1B_{j+1}である長さWの配列Aが与えられる。Bの値を求めよ」

STEP1よりW≡1,2なので余りが1の場合、2の場合に場合分けして考えてみます。
①Wの余りが1の時
全てのマスは3回ずつ選ばれるのでAを合計して、3で割った商を求めることでAの合計を求めることが可能です。
調べたいマスをj番目とするとB(j+2)WB_{(j+2)%W},B(j+5)WB_{(j+5)%W}.....B(j+W2)WB_{(j+W-2)%W}を合計から引くことでBjB_{j}を求めることが出来ます。
②Wの余りが2の時
余りが1の時と同様に爆弾の個数の合計を求めることが出来ます。
調べたいマスをj番目とするとB(j+1)WB_{(j+1)%W},B(j+4)WB_{(j+4)%W}.....B(j+W1)WB_{(j+W-1)%W}の和から答えの合計を引くことでBjB_{j}の答えを求めることが出来ます。
①、②は左右の累積和を用いることにより前処理O(W),それぞれO(1)で実装可能です。

●STEP3
STEP2の問題を2次元に拡張します。
i行目(1<=i<=H)についてSTEP2を考えることでB(i1)H,jB_{(i-1)%H,j}+Bi,jB_{i,j}+B(i+1)H,jB_{(i+1)%H,j}が全てのj(1<=j<=W)について求まります。
次にj行目についてSTEP2を考えることによって全てのBi,jB_{i,j}を求めることが出来ます。
全体の計算量はO(HW)となります。