题外话:在 这篇题解 中并没有证明该做法的正确性,并且我也没看到有什么比较严谨的证明,所以自己写了个证明。
如果有更加简洁的证明方法,欢迎指教。
首先由官方拓扑排序做法可以知道,将 P−1 翻转,我们实际上是要通过交换相邻两个权值差不小于 K 的位置使得字典序最大。
考虑证明如下事实:对于排列 P,每次任意交换一对满足 Pi+K≤Pi+1 的 Pi 和 Pi+1,当无法继续交换的时候,所得就是最优解。
首先,由于交换会使逆序对恰好减少 1,因此一定能通过不超过 O(n2) 次交换停止。
考虑反证法,设最终得到的排列为 P。
假设所得的首位不是最优解,则记最优解中首位为 Pi,由合法性可知 ∀x<i,都有 ∣Px−Pi∣≥K。由最优性可知 Pi>P1。
考虑找出 [2,i] 中第一个 ≥Pi 的位置 j,则易知 ∀x∈[1,j),Px+K≤Pi≤Pj,则有 ∣Pj−Pj−1∣≥K,矛盾,因此首位一定是最优解。
进一步地,我们可以证明 P 就是最优解。
可以发现由于上述证明,翻转是没有必要的,我们可以直接在 P−1 上任意交换 Pi>Pi+1+K 的位置即可。
注意到上述证明用到了 ∣Pi−Pj∣≥K 的一些性质,如果将限制变为 ∣Pi−Pj∣≤K,则上述结论不再成立。此时存在一些显然的 Hack,比如 K=2,序列为 2 3 4 1。