-
先注意读题:
-
对于所有的值 \(k\),在这个序列的任意子区间 \([l,r]\) 中,值为 \(k\) 且为红色的位置数 减去 值为 \(k\) 且为蓝色的位置数 的绝对值不超过 \(1\)
-
注意是任意子区间
-
这说明什么?说明如果只有第二个条件,我们只需要让拥有相同值的数交替染红色和蓝色即可,因此一种值最多只有两种情况,最终答案的情况是 \(2^k\)
-
我们考虑加上第三个限制怎么做?考虑遇到第一个红蓝组成的子序列不等的值,此时我们存在唯一一种是否交换这两种颜色的方案,使得红子序列字典序严格小于(或大于)蓝子序列;如果两个子序列值相等的两个位置,交换后肯定还相等。
-
因此,设 \(a\) 表示红 \(<\) 蓝的方案数,\(b\) 表示蓝 \(<\) 红的方案数,\(c\) 表示 \(=\) 方案数。可以知道 \(a=b,a+b+c=2^k\),所以 \(a=b=\frac{2^k-c}{2}\)
-
现在我们只需要考虑怎么求 \(c\)。我们发现如果出现
1 2 2 1
这种形状的,那肯定就不行了,因为无论染成什么颜色都会有相应的大小关系,即 \(c=0\) -
而如果不是这种形状,如果把同一个值的第奇数个和第偶数个连一条线段,则两两线段不会互相包含,那这两个值第一个位置染的颜色必须相同,也就是说他们被”绑定“了。设绑定的组数为 \(d\),则 \(c=2^d\)
-
最终复杂度 \(O(n \log n)\),\(\log\) 在并查集