题意大概就是给你一个排列 ,你每次可以找到 中相邻两个数并将其移至另一个初始为空的队列的开头,让最终 的字典序尽量小。
过程大概就是这样:
题解
由于字典序大小是从前往后决定的,所以我们考虑从前往后确定这个序列,也就是将题意中的过程倒着做。
我们考虑在某一状态下,选择的两个数在原序列中是 ,那么再次之前的选择中,不可能出现选择的数为 使得 或。
于是我们发现倒着考虑是,选择 时就是把序列分成了 这段,这 段相互独立。
我们考虑怎样的 是合法的。显然就是 长度均为偶数时(可能为空)。
所以 一定为奇数,一定为偶数。
我们可以维护出 中奇数位于偶数位的最小值,并用一个小根堆维护每一个 的最小值即可,每次选择后将 分成 段重新放入堆中。
代码
1 |
|