問題はこちら
問題概要
爆弾が個あり,番目の爆弾は座標にあってのときオフ,のときオンになっている.本のコードがあり,番目のコードを切ると,座標が以上以下のすべての爆弾の電源のオン・オフが切り替わる.切るコードをうまく選ぶことですべての爆弾の電源をオフにすることができるか判定し,できるならばそのコードの組合せを一つ出力せよ.解説
公式解説が急にグラフを作り出してるので,自然な流れ重視で説明します.公式解説の前半に書かれてる処理はすでに行っているものとします.隣り合う爆弾の状態のXOR(状態が違うなら,同じなら)を考える.番目の爆弾を切り替えるとき,番目と番目の爆弾の状態のXOR(これをとします),番目と番目の爆弾の状態のXOR()のみが切り替わります.便宜上番目と番目の状態の爆弾があるとします.このように考えることで,区間を変更しにする問題が2点()を変更しからをにする問題になりました.
入力例での例
ここで上図を見ると,を変更できるのは緑のコードだけです.であることから緑のコードは必ず使うことになります.緑のコードを使うと次はを変更できるのが青のコードだけになります.このときなので青のコードは使いません.このようにして変更できるコードがつだけのがある限り決めていけばいいです.
この方法では上図の場合で出来なくなりますが,あるつのコードは他のコードの組合せで表されるので適当なコードを消してもいいことがわかります(例えば赤のコードを使うのと青と緑のコードを使うのは同じこと).
このようにして使うコードを決めた後,すべてのがになってればOK.
これでも解けますが,もう少し言い換えるとあるつのコードは他のコードの組合せで表されるというのはの辺を張ったグラフ上で閉路を意味します.上の解法は閉路がある限りその閉路から辺を取り除くという操作に対応します.