C - Roughly Sorted Editorial by maroonrk_admin
まず,\(P\) が与えられたときに最小の操作回数を求めることを考えます.
各 \(i\) について,\(P_j>P_i\), \(j<i\) を満たす \(j\) の個数を \(x_i\) で表すことにします. もし,\(x_i > K\) を満たす \(i\) が存在するなら,そのような \(i\) の中で最小のものをとると,\(P_{i-1}>P_i\) が成り立ち,故に \(P_{i-1},P_i\) を swap することで転倒数が減ります.
よって最小の操作回数は,\(\sum \max(x_i-K,0)\) と求められます.
ところで,最小回数を達成する操作を行った場合,最終的な \(P\) の様子は一意です. これは,各値 \(v=N,N-1,\cdots,1\) について,\(v\) 以上の値だけ見たときに \(v\) の相対的な位置がどこになるかを考えるとわかります.
元の問題を解きます. \(P\) において,各値 \(v=N,N-1,\cdots,1\) について,\(v\) 以上の値だけ見たときに \(v\) の相対的な位置がどこになるかを考えます. \(P'\) において,\(v\) より先に登場し,かつ \(v\) より大きい数の個数を \(y_v\) とおきます. すると,\(y_v<K\) ならば \(v\) の相対位置は固定であり,逆に \(y_v=K\) ならば,最終的な \(P'\) における位置と同じかそれより右ならどこでもいいとわかります.
よって,最終的な答えはそれぞれの \(v\) について位置の候補の個数をかけ合わせた値です.
計算量は \(O(N^2)\) または \(O(N\log N)\) です.
posted:
last update: