●STEP1
制約式の「H×Wは3で割り切れない」より
H×W≡1,2(mod3)
⇔H≡1,2(mod3),W≡1,2(mod3)と同値変形可能です。
●STEP2
まず一次元の場合の解法を考えてみましょう。
以下のような問題を考えてみます。
「=++である長さWの配列Aが与えられる。Bの値を求めよ」
STEP1よりW≡1,2なので余りが1の場合、2の場合に場合分けして考えてみます。
①Wの余りが1の時
全てのマスは3回ずつ選ばれるのでAを合計して、3で割った商を求めることでAの合計を求めることが可能です。
調べたいマスをj番目とすると,.....を合計から引くことでを求めることが出来ます。
②Wの余りが2の時
余りが1の時と同様に爆弾の個数の合計を求めることが出来ます。
調べたいマスをj番目とすると,.....の和から答えの合計を引くことでの答えを求めることが出来ます。
①、②は左右の累積和を用いることにより前処理O(W),それぞれO(1)で実装可能です。
●STEP3
STEP2の問題を2次元に拡張します。
i行目(1<=i<=H)についてSTEP2を考えることで++が全てのj(1<=j<=W)について求まります。
次にj行目についてSTEP2を考えることによって全てのを求めることが出来ます。
全体の計算量はO(HW)となります。