[AGC001F] Wide Swap

题意

给定一个排列,若 \(i, j\) 满足 \(j - i \ge k\)\(|p_i - p_j| = 1\),则可以交换 \((p_i, p_j)\),你需要操作若干次,使得最终字典序最小。

你需要输出最终的序列。

\(n \le 5 \times 10 ^ 5\)

Sol

套路地,转成逆排列。

首先显然原排列字典序最小等价于逆排列字典序最小。

问题转为交换排列 \(p ^ {-1}\) 的相邻元素 \(i, i + 1\),需要满足 \(p ^ {-1}_i - p ^ {-1}_{i + 1} \ge k\)

考虑一个较强的结论,每次交换任意满足条件的相邻元素,逆排列一定能变为最小字典序的排列。

(此处 \(p\) 均指逆排列)

证明:考虑当前序列与最优序列的首位字典序不相同的元素 \(p_i\) 的移动过程,设原来在 \(p_i\) 移动轨迹上的元素集合为 \(S\),显然由于 \(p_{i + 1, ... n)}\) 无法跨过 \(p_i\)(若存在跨过而未跨过就不是最优序列了),那么影响 \(S\) 的只有 \(p_{1, ... i - 1}\) 交换过来的元素,显然由于 \(p_k - p_j \ge k\)\(p_j - p_i \ge k\)\(p_k + k - p_i \ge k\),因此于 \(p_i\) 毫无影响,结论成立。

考虑用归并优化这个 \(n ^ 2\) 的冒泡。

对于区间 \((l, mid)\)\((mid + 1, r)\),其中内部顺序一定确定,只需判断 \(p_{mid + 1, ... r}\) 是否满足小于 \((l, mid)\)\(\text{后缀最小值} - k\) 即可。

posted @ 2024-06-19 09:35  cxqghzj  阅读(3)  评论(0编辑  收藏  举报