Merge Not Sort

先来讲一下我的做法

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

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

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

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

\(f[i][j]|=f[k][2n-i+1-j]\),要求\(a[k]>max_{i≤l<k}(c[l])\)(根据对称性可以得出)

然而现在有个问题就是这个DP不好记录中途的转移,这里介绍一种新方法,由于是可行性DP,中途只要找到一个\(f[k][2n-i+1-j]\)\(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](1\leq p\leq k)\),那么将\(c[p\) ~ \(k]\)作为一块;重复上述过程即可。其实可以知道,这个构造的过程跟题解的过程本质上是相同的,正确性就看题解了

posted @ 2024-07-09 19:06  最爱丁珰  阅读(16)  评论(0)    收藏  举报