[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\) 序列。(反正就是上述性质可以保证能移动过来就过来)

code

posted @ 2023-06-18 09:44  wscqwq  阅读(14)  评论(0编辑  收藏  举报