誤っている位置の集合を とし、 とする。
なら答えは である。
なら答えは である。誤っている位置をすべて選び、ちょうど 個になるまで固定点を追加すれば、1 回の並べ替えですべてを正しい位置にできる。
以下、 とする。2 回の並べ替えで選ぶ位置集合を とする。 より、
が成り立つ。 の外側の位置は一度も操作されないので、最初から固定点でなければならない。
固定点が 1 つ以上存在する場合、答えは である。 なので 1 回では不可能であり、1 つの固定点を両方の選択集合の外側に置くことで常に 2 回以内に整列できる。
次に固定点が 1 つもない場合を考える。このとき の外側には位置を置けないので、上の等式から となる。したがって は全位置を二分する。 の位置は 1 回目でしか操作されないため、1 回目の終了時点ですべて正しくなければならない。
順列をサイクル分解する。あるサイクルの一部だけを に入れると、その中の少なくとも 1 位置が必要とする値が に残る。よって はいくつかのサイクル全体の合併でなければならない。逆に、長さの合計がちょうど になるサイクルを選べれば、それらを 1 回目で、残りを 2 回目で整列できる。
したがって固定点がない場合、2 回で整列できるための必要十分条件は、サイクル長の一部の和がちょうど になることである。この条件は部分和 DP により で判定できる。
そのような部分集合が存在すれば答えは 、存在しなければ答えは である。後者では 2 回が不可能である一方、最初の 1 回で固定点を 1 つ作れば、さらに高々 2 回で整列できる。
よって答えは常に のいずれかである。各テストケースの計算量は 、メモリ使用量は である。
Solution written by GPT5.6