[ABC299G]MinimumPermutation

[ABC299G] Minimum Permutation

考虑一个必要的性质:如果现在有一个数 x1,它后面有一个数 y<x1,且 x1 又在 y 后面出现了若干次(x2,x3,,xk,我们直接考虑最后一个 xk),那么 x1 一定不是答案。(显然前面的 x1 可以不选,然后选择 y,x2xk 这样任意一个,首先 x,y 二者的顺序发生改变,其他部分又完全没有影响)。

发现了这一点就可以做了。

我们维护一个单调栈。

一次考虑每个 ai

  • 栈中有了,什么都不做
  • 栈中没有
    • 如果栈顶满足上述的性质,那么弹出栈顶(可以循环多次)
    • 然后,插入 ai

这样我们尽力让每个数尽量往前放,比如 1,如果满足上述性质,我们就尽量让它往前放了。

粗略的证明一下。假设有两个序列 A,B*,A 的字典序小于 B,且 A 是字典序最小的。

A 的第一个与 B 不同的位置为 xAxB 中出现的位置 y 一定在 x 之后。

By 能移动到 x,在处理 B 的时候 By 会被移动到 x,所以不会找到 B 序列。(反正就是上述性质可以保证能移动过来就过来)

code

本文作者:wscqwq

本文链接:https://www.cnblogs.com/wscqwq/p/17488724.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wscqwq  阅读(17)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起