第二回全国統一プログラミング王決定戦予選 C - Swaps
問題
とがある。以下の操作を回以下行って、にできるか判定する。
- を選択し、との値を入れ替える
考察
が昇順であると仮定する。を昇順にソートして比較するとき、を満たさないが存在すれば、実現不可能である。以下、これは満たされていると仮定する。
をソートするのに回以下ならば実現可能である。以下では、のソートに回かかった場合について考える。
次の補題を利用する(証明は後述)
-順列を選択ソートで昇順に並び替えるときに必要な交換回数が回なら、の任意の2要素を交換した順列は回の交換で昇順にできる
ともに昇順になっているので、とを交換してが成り立つ、すなわちになるようなが存在するか判定すればいい。
証明
[補題] -順列を選択ソートで昇順に並び替えるときに必要な交換回数が回なら、の任意の2要素を交換した順列は回の交換で昇順にできる
は、昇順に並んだ-順列との任意の要素から、次の操作を回行って作ることができる。
- 今まで交換していない番号とを交換する。
の交換すうr2要素のうち、としても、を作るために選んだ番号の列が存在し、なるが存在する。 は、をから、を作ったときと逆順に操作を行えば、回の操作での要素を昇順に戻すことができた。 残りの要素は、回の交換で任意の順番に並び替えられるので、回以下で全体を昇順に戻すことができた。 よって、全体は回以下の交換で昇順にできる。
が回より少ない交換で昇順にできるなら、は回未満の交換で昇順にできるが、これは仮定に矛盾するので、は回の交換で昇順にできることが示せた。