難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) 未投票 (0票)

投票の分布

まだ投票はありません。

  1. Lv.10票
  2. Lv.20票
  3. Lv.30票
  4. Lv.40票
  5. Lv.50票
  6. Lv.60票
  7. Lv.70票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

Flipping Puzzle

作成者 loop0919

難易度(作成者設定) Lv.6

難易度(投票) 未投票 (0票)

実行時間制限
4 秒
メモリ制限
512 MiB

解説

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

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

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

  • (x,y)=(1,1),(1,2),(1,3),⋯ ,(1,W−1),(2,1),(2,2),⋯ ,(H−1,W−1)(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=W−1y = W-1 が終了した時点でマス (x,W)(x, W) が黒色に塗られていた場合、不可能である。
  • 全ての走査が終わった際に、黒色に塗られているマスが残っている場合、不可能である。

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

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

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

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

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

ユーザー解説

ユーザー解説を書く

ユーザー解説はまだありません。