Merge Not Sort

先来讲一下我的做法

在考虑特殊元素无果之后,我们尝试模拟法,即模拟什么时候从放一个序列的元素变成放另一个序列的元素

由于对称性,我们不妨假设最开始放的A

那么就有A[1]<B[1],假设指针一直到i,则A[i]>B[1],然后A[1~i1]都被放入了连续的一段,接下来再放B

由于对称性,可以知道这是一个子问题,于是可以想到DP,设f[i][j]表示对于i~2n这些字符,是否存在一种放法使得A的长度为j

f[i][j]|=f[k][2ni+1j],要求a[k]>maxil<k(c[l])(根据对称性可以得出)

然而现在有个问题就是这个DP不好记录中途的转移,这里介绍一种新方法,由于是可行性DP,中途只要找到一个f[k][2ni+1j]1就可以转移,于是可以直接DFS,具体见代码

然后讲一下官方题解的方法,可以看这篇博客

解释一下这句话:这样做显然是正确的。因为如果一个块的任意一个非块头元素放到另一个序列都会被先放到c

首先A,B无论是什么样子,其中的元素的相对位置是不会变化的,所以假设一个块是c[l ~ r],不妨设A中有c[l ~ k]B中有c[k+1 ~ r],那么两个指针肯定会在某一时刻,其中一个指向A[l],另一个指向B[k+1](假设其他的块都是正常放的),此时c[k+1]就会先于c[l]放,这显然是不行的,所以是不可能的

由以上两种方法,我觉得还是自己的方法好理解一些,不知道这个方法怎么想到的

update 2024.9.6

重新做一遍,用的是题解的方法,但是不是像题解这么找的块,而是考虑的特殊元素:设当前还剩下的没有分块的数为c[1 ~ k](最开始k=2n),那么找到c[1 ~ k]最大的数,假设是c[p](1pk),那么将c[p ~ k]作为一块;重复上述过程即可。其实可以知道,这个构造的过程跟题解的过程本质上是相同的,正确性就看题解了

posted @   最爱丁珰  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示