[ABC299G]MinimumPermutation
[ABC299G] Minimum Permutation
考虑一个必要的性质:如果现在有一个数 \(x_1\),它后面有一个数 \(y<x_1\),且 \(x_1\) 又在 \(y\) 后面出现了若干次(\(x_2,x_3,\dots,x_k\),我们直接考虑最后一个 \(x_k\)),那么 \(x1\) 一定不是答案。(显然前面的 \(x_1\) 可以不选,然后选择 \(y,x_2\sim x_k\) 这样任意一个,首先 \(x,y\) 二者的顺序发生改变,其他部分又完全没有影响)。
发现了这一点就可以做了。
我们维护一个单调栈。
一次考虑每个 \(a_i\)。
- 栈中有了,什么都不做
- 栈中没有
- 如果栈顶满足上述的性质,那么弹出栈顶(可以循环多次)
- 然后,插入 \(a_i\)。
这样我们尽力让每个数尽量往前放,比如 \(1\),如果满足上述性质,我们就尽量让它往前放了。
粗略的证明一下。假设有两个序列 \(A,B\)*,\(A\) 的字典序小于 \(B\),且 \(A\) 是字典序最小的。
\(A\) 的第一个与 \(B\) 不同的位置为 \(x\),\(A_x\) 在 \(B\) 中出现的位置 \(y\) 一定在 \(x\) 之后。
\(B_y\) 能移动到 \(x\),在处理 \(B\) 的时候 \(B_y\) 会被移动到 \(x\),所以不会找到 \(B\) 序列。(反正就是上述性质可以保证能移动过来就过来)