第三回 アルゴリズム実技検定 N - 入れ替えと並び替え
問題
長さの数列に、以下の合計個のクエリを実行した結果を求める。
- とをスワップ
- を昇順に並び替える
考察
1つ目のクエリはで実行可能なので、2つ目のクエリを高速に行う方法を考える。
数列の転倒数は、1つ目のクエリでは1増減し、2つ目のクエリでは発生するスワップの回数分だけ減少することがわかる。 よって、全ての2つ目のクエリで発生するスワップの合計は高々回であることがわかった。 また、2つ目のクエリではとなる箇所でスワップされるので、このようなの集合を知っておく必要がありそう。
1つ目のクエリでとをスワップすることを考える。 かどうかの関係が変わる可能性があるのは、の3箇所なので、これらの関係がか判定し、を更新する。
2つ目のクエリで昇順にソートすることを考える。 なるがあるとき、を更新し、の関係を元にを更新する。
setのデータ構造を用いると、上記の処理がで十分高速に実行可能である。