本文共 3589 字,大约阅读时间需要 11 分钟。
翻译

题解
菜逼选手又来报到啦!
对于字典序最小的问题,我们显然是用按位确定的思想 定义几个变量方便使用 c n t 0 cnt0 cnt0表示 A A A序列当前有多少个前缀最大值, c n t 1 cnt1 cnt1表示 B B B序列当前有多少个前缀最大值 m x 0 mx0 mx0表示 A A A序列当前的最大值, m x 1 mx1 mx1表示 B B B序列当前的最大值 对于第 i i i位的确定工作,先分析能对序列大小做出贡献的序列的性质 假设我们后面能分成两个前缀最大值序列 C C C与 D D D,满足 s i z ( A ) + s i z ( C ) = s i z ( B ) + s i z ( D ) siz(A)+siz(C)=siz(B)+siz(D) siz(A)+siz(C)=siz(B)+siz(D),且满足 A C AC AC合并与 B D BD BD合并后前缀最大值仍是前缀最大值,显然剩下的数总有方法填入的,故合法 分析序列 C C C与 D D D的性质 先找出原序列的所有前缀最大值,不妨设这个序列为 E E E 给出结论就是 C , D C,D C,D之中至少有一个序列满足是 E E E的完全子集,证明考虑反证 即 C , D C,D C,D中均存在至少一个数非原序列前缀最大值,则交换两数后 C , D C,D C,D的前缀最大值个数均减少 1 1 1,因为能制裁他们的都在对面的序列。连续做如上过程,我们总能使得其中至少一个序列成为 E E E的完全子集 不妨枚举哪个序列成为了完全子集,以 C C C为例 如果 D D D序列中存在 E E E的 x x x个元素,存在非 E E E序列中的 m m m个元素,且第 i i i位之后存在 T T T个 E E E中的元素,我们可以列出方程 c n t 0 + T − x = c n t 1 + x + m cnt0+T-x=cnt1+x+m cnt0+T−x=cnt1+x+m 移项可知是 c n t 0 − c n t 1 + T = 2 ∗ x + m cnt0-cnt1+T=2*x+m cnt0−cnt1+T=2∗x+m 左边是常数,我们仅需要知道右边能构成这样的序列即可 将是 E E E序列中的元素的权设为 2 2 2,其他的元素权设为 1 1 1,则我们需要知道一个上升序列且其权能够组成 2 ∗ x + m 2*x+m 2∗x+m 分奇偶讨论,我们发现如果一个数 u u u能够组成,则 u − 2 u-2 u−2也能够组成 维护两个 b i t bit bit,支持最大值查询即可
#include #include #include #include #include #include #include #include #include
转载地址:http://remu.baihongyu.com/