Solution
考虑知道前面的一段后,怎么判断后面是否合法,这样就可以逐位确定。
先上一个结论:令 m x i mx_i mxi为原序列 1 1 1~ i i i的最大值所在位置,我们称原序列中每个 m x i = i mx_i=i mxi=i的位置为上升位,分割后的序列的新的上升位为新晋上升位,那么若存在一种合法方案,一定可以将其调整为其中一个序列中的所有上升位置都是原序列的上升位。
证明可以考虑若两个序列都存在新晋上升位,一定是因为前面比它大的原序列上升位在另外一个序列,所以交换这两个新晋上升位,两个序列都会减少一个新晋上升位。
有了这个结论,我们就可以开始判断了。如果现在要确定第
i
i
i位,先考虑令第一个序列在
[
i
+
1
,
n
]
[i+1,n]
[i+1,n]的上升位都是原序列的上升位。设在已经确定的位置中,第一个序列的上升长度为
l
0
l_0
l0,第二个为
l
1
l_1
l1,在
[
i
+
1
,
n
]
[i+1,n]
[i+1,n]中,共有
Q
Q
Q个原序列的上升位置,第二个序列用了其中的
k
k
k个,用了新晋上升位
m
m
m个,那么可以得到如下等式:
l
0
+
Q
−
k
=
l
1
+
k
+
m
l_0+Q-k=l_1+k+m
l0+Q−k=l1+k+m移项得:
l
0
+
Q
−
l
1
=
2
k
+
m
l_0+Q-l_1=2k+m
l0+Q−l1=2k+m
那么后面不属于这
Q
+
m
Q+m
Q+m个数的位置该如何分配呢?我们要令他们不能够对上升长度产生贡献,那么就把他们分配到前面第一个原序列的上升位所属的那个序列即可。
再观察等式,左边是常量,后面的意义是这样的:令原序列的上升位权值为 2 2 2,其它为 1 1 1,一个上升序列的权值和。然后我们只需要维护值为奇数和偶数的上升序列最大权值即可,因为如果等式左边可以等于 x x x,那么也能调整为 x − 2 x-2 x−2(但不能为负数),证明的话考虑每次从第二个序列移走一个原序列的上升位以及移走这个位置之后会产生的新晋上升位,这样第二个序列的长度 − 1 -1 −1(即 k − 1 k-1 k−1);而把所有原序列的上升位移走后,则可以通过每次移走两个新晋上升位来实现 m − 2 m-2 m−2。
这个东西的维护的话可以用主席树,也可以用带撤销(不知道是不是这样叫)的树状数组。