解説

この問題について、以下のことが言えます。

  • ある x,yx, y22 回以上選ぶ必要はない。
  • x,yx, y を選ぶ順番は考慮する必要がない。

また、以下のような順で操作を行うことが最適です。

  • (x,y)=(1,1),(1,2),(1,3),,(1,W1),(2,1),(2,2),,(H1,W1)(x, y) = (1, 1), (1, 2), (1, 3), \cdots, (1, W-1), (2, 1), (2, 2), \cdots, (H-1, W-1) の順で走査する。
  • マス (x,y)(x, y) が黒色に塗られていた場合に操作を行う。
  • y=W1y = W-1 が終了した時点でマス (x,W)(x, W) が黒色に塗られていた場合、不可能である。
  • 全ての走査が終わった際に、黒色に塗られているマスが残っている場合、不可能である。

このように処理を行い操作回数を数えることで、最小の操作回数を求めることができます。
しかしながら、愚直にこのように実装をすると O(HW)O(HW) の計算量が必要になり、実行時間に間に合いません。

ここで、マス(x1,W1)(x-1, W-1) までの走査が終わっている状態で、 マス (x,y1),(x, y_1), マス (x,y2),,(x, y_2), \cdots , マス (x,yk)(x, y_{k}) が黒色のマスであるとします。 ここで、 kk が奇数である場合はその列を全て白色にすることが不可能ですので -1 を出力して終了させます。

すると、操作を行う必要があるマスは、マス (x,y1)(x, y_1) からマス (x,y21)(x, y_2 - 1)までと、マス (x,y3)(x, y_3) からマス (x,y41)(x, y_4-1) までと、 \cdots、 マス (x,yk1)(x, y_{k-1}) からマス (x,yk1)(x, y_k-1) までの k/2k/2 区間となります。

そして、G[y]:=(G[y] := (マス (x,y)(x, y) で操作を行う必要があるならば 11、そうでなければ 0)0) を考えることで、その情報は区間 XOR 区間和の遅延評価セグメント木に乗せることができます。

全ての走査が終了した段階で、総和が 00 のときに操作回数の合計を出力し、そうでなければ -1 を出力することで答えを求めることができます。

想定解

C++
pypy3