AT_awtf2024_d 题解

· · 题解

模拟赛做到了这道题,感觉妙,写个题解。

首先发现原题等价于可以给某些数加上 n 后再排成升序,这样在原序列上把加过的数排好序放到最后,剩余数排好序放到前面,只有分界点可能 P_i>P_{i+1},符合原题意。

直接排序需要的交换次数为序列的逆序对数,我们在此基础上考虑给数加 n 导致的变化量。首先有一个性质:若 x<yP_x>P_y,则给 P_x 加却不给 P_y 加一定不优。证明如下:

考虑加上 n 的位置集合为 S,我们找到 x<yP_x>P_y,同时 S 包含 x 且不包含 y 的所有 (x,y),再找出其中 P_x-P_y 最小的一对,可以证明此时从 S 中删去 x 并加入 y 一定更优,具体见下图:

图中横坐标为 i,纵坐标为 P_i(下同),修改即为从两个红点变成两个黑点。我们分别分析修改后的变化量:

以上贡献均非正,所以修改后一定更优,结论得证。

从这个结论出发,我们可推得以下两条:

所以若目前要给 i 加,根据第一条所有 j>i,P_j<P_ij 一定加过了(记数量为 c_1),根据第二条所有 j<i,P_j>P_ij 一定还没加(记数量为 c_2),此时若 i 是第 k 个被加的,贡献即为 f_i=c_1-c_2+(n-i)-(k-1),其中 (n-i)-(k-1) 比较复杂,详见下图:

可以发现 $c_1$ 和 $c_2$ 已经可以在求逆序对时顺便求出了,但还可以再做一些推导。显然有 $c_3=n-i-c_1$,则 $c_2=n-P_i-c_3=n-P_i-n+i+c_1=i-P_i+c_1$,所以有 $f_i=c_1-c_2+(n-i)-(k-1)=n+P_i-2i-(k-1)$。 注意到 $n-(k-1)$ 与 $i$ 的选择无关,所以把所有的 $i$ 按照 $P_i-2i$ 升序排序,枚举加的个数,选 $f$ 最小的若干个加,对所有个数取最小值即可。 另外其实需要 $i$ 的 $c_1$ 中所有点先于其自身被加,但是注意到这些 $j$ 满足 $j>i,P_j<P_i$,所以 $f_j<f_i$,一定先于 $i$ 被选了,所以做法没问题,时间复杂度 $O(n\log n)$。 这是[提交记录](https://atcoder.jp/contests/awtf2024-open/submissions/62706425)。