[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\) 即可。