[AGC055C]Weird LIS

Posted StaroForgin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[AGC055C]Weird LIS相关的知识,希望对你有一定的参考价值。

Weird LIS

题解

英文题解的长篇大论贞德很难看懂耶,又没找到中文题解┭┮﹏┭┮

我们考虑怎样的序列 A A A可能会是合法的,即拥有对应的排列。
我们设 K = max ⁡ i = 1 n A i K=\\max_{i=1}^{n}A_{i} K=maxi=1nAi,显然有 ∀ i ∈ [ 1 , n ] , A i ∈ [ K − 1 , K ] \\forall i\\in[1,n],A_{i}\\in[K-1,K] i[1,n],Ai[K1,K]
我们先定义两类点,分别是必需点与非必需点,从名称上应该比较好理解。
显然,非必需点要么不在我们的最长上升子序列中,要么有其它点可以与之发挥等效的价值。
而必需点则是没有其他点能够发挥等效价值的,去掉它就意味着我们最长上升子序列长度的减小。

我们先对于所有 A A A的情况都相同的情况单独论证一下。
这种情况意味着要么我们所有点都是必需点,要么所有点都是非必需点。
所有点都是必需点的情况显然就是一个 { 1 , 2 , 3 , 4 , . . . , n } \\{1,2,3,4,...,n\\} {1,2,3,4,...,n}的序列,这种情况下,所有 A A A都是等于 n − 1 n-1 n1的。
而所有点都是非必需点的情况,那么每一个点都必然有至少一个可与之替换的点,所以我们的 K ⩽ ⌊ n 2 ⌋ K\\leqslant \\lfloor\\frac{n}{2}\\rfloor K2n
这样的一个序列我们也还是相当容易构造出来的,像 { n − K + 1 , n − K + 2 , . . . , n , n − 2 K + 1 , n − 2 K + 2 , . . . } \\{n-K+1,n-K+2,...,n,n-2K+1,n-2K+2,...\\} {nK+1,nK+2,...,n,n2K+1,n2K+2,...}就可以构造出来了。

那么我们下面就只需要讨论 K K K K − 1 K-1 K1都在我们的 A A A序列中出现了的情况了。
显然,在这种情况下,我们的 K K K是可以表示我们整个序列的最长上升子序列长度的,由于必然有一个点不在我们的最长上升子序列中,去掉这个点,必然不影响我们最长上升子序列的长度,所以必然能取到。
而我们的 A = K − 1 A=K-1 A=K1的点都是必然在我们的最长上升子序列中的,也就是我们的必需点, A = K A=K A=K的点去掉后也不会影响,也就是我们的非必需点。
显然,我们的每一个 A = K − 1 A=K-1 A=K1的点都会为我们的最长上升子序列贡献 1 1 1的长度,记其数量为 K 1 K_1 K1,显然, K K K必然是不小于 K 1 K_1 K1的。
而我们 A = K − 2 A=K-2 A=K2的点有可能为我们的最长上升子序列贡献长度。
我们记可以把所有 A = K A=K A=K的点的位置看成被 A = K − 1 A=K-1 A=K1的点拆分开的连续段。
对于一个连续段,如果该连续段的左右边的 A = K − 1 A=K-1 A=K1的点的权值为 L L L R R R的话(边界我们可以看成极值),那么这个连续段的点只有在选到 [ L , R ] [L,R] [L,R]中时才可能对我们的 K K K产生贡献。
在某个长度上产生贡献的点必然是成对存在的,这也意味着如果一个长度为 l e n len len的连续段,产生的贡献最大为 ⌊ l e n 2 ⌋ \\lfloor\\frac{len}{2}\\rfloor 2len
如果我们有 m m m个连续段,长度分别为 Q 1 , Q 2 , . . . , Q m Q_1,Q_2,...,Q_m Q1,Q2,...,Qm,我们记 K 2 = ∑ i = 1 m ⌊ Q i 2 ⌋ K_2=\\sum_{i=1}^{m}\\lfloor\\frac{Q_i}{2}\\rfloor K2=i=1m2Qi
显然,我们的 K K K的范围限制, K ∈ [ K 1 , K 1 + K 2 ] K\\in[K_1,K_1+K_2] K[K1,K1+K2]

我们考虑我们去证明我们是否能对所有满足上面的条件的序列都构造出一种合法的排列。
我们其实去构造一下就知道了,应该是比较好想到的。
我们可以考虑将我们的 A = K − 1 A=K-1 A=K1的位置提出来,形成新的序列。
我们先将与我们最长上升子序列无关的的部分填上去,显然,我们有一种方法是将前面的一部分与后面的一部分填满,设前面填了 L L L个,后面填了 R R R个。
那么对于前面,我们可以依次这样填 { n , n − 1 , n − 2 , . . . , n − L + 1 } \\{n,n-1,n-2,...,n-L+1\\} {n,n1,n2,...,nL+1},而对于后面,我们可以依次这样填 { R , R − 1 , . . . , 1 } \\{R,R-1,...,1\\} {R,R1,...,1}
显然,这种前面的会影响我们的最长上升子序列当且仅当它填到倒数第二个必需点的后面去了;
而后面这部分会影响我们的最长上升子序列当且仅当它填到正数第二个必需点的前面么去了。
如果我们这样填的话,产生冲突的只有我们总共只有两个必需点的情况。
但并不是所有两个必需点的情况都会产生影响,由于我们可能虽然只有两个必需点,但我们中间还有可能有一部分要产生贡献的点,将中间这段区间分开,我们还可以根据这部分点将其分开。
如果我们连这部分点都没有了,说明我们的最长公共子序列长度必然为 2 2 2,但我们的 A ⩾ 2 A\\geqslant 2 A2 K − 1 = 1 K-1=1 K1=1,不可能在 A A A中出现,也就不需要考虑了。

既然我们已经将前一半与后一半都填满了,中间空出来了一部分区间,留给我们想贡献给答案的非必需点的。
我们可以把这部分点和我们的必需点合成一个序列看,在这上面填。
对于必需点在这个序列上将我们的费必需点序列分成若干个不相交区间,如果一个长度为 n ′ n' n的区间贡献为 k k k,我们可以这样填,假设填的数从 1 1 1开始, { n − k + 1 , n − k + 2 , . . . , n , n − 2 k + 1 , n − 2 k + 2 , . . . , n − k , n − 3 k + 1 , . . . , 1 , . . . } \\{n-k+1,n-k+2,...,n,n-2k+1,n-2k+2,...,n-k,n-3k+1,...,1,...\\} {nk+1,nk+2,...,n,n2k+1,n2k+2,...,nk,n3k+1,...,1,...}
显然,这部分数的取值范围都在该区间两侧的必需点数的区间内的。
如果直接这样想的可能不太好填,我们可以考虑就那个 c n t cnt cnt当指针一个一个放进去之类的,反正整个序列的数都在我们都在没贡献的区间内啦!
还是举例说明吧 ,我终于明白为什么官解都认为自己讲不清楚了,就用官方题解给出的序列
A = { 4 , 5 , 5 ,

以上是关于[AGC055C]Weird LIS的主要内容,如果未能解决你的问题,请参考以下文章

WeIrD StRiNg CaSe

cf299C Weird Game

CodeForces 788B--Weird journey

Codeforces 789D Weird journey - 欧拉路 - 图论

HDOJ 1393 Weird Clock(明确题意就简单了)

DOCKER_HOST have a weird tcp