CF1322E 题解

转换为 $01$ 序列的操作其他题解都已经讲的很清楚了,我这里主要提供一种只用线段树来维护答案的方法。

首先是得到操作数。初始序列上是全 $0$ 的,我们从小到大枚举每个数,并把他们修改成 $1$。由于答案是 $01$ 交错段的长度的一半,我们线段树上的每个结点分别维护左部是 $0/1$,右部是 $0/1$,左部交错段的长度,右部交错段的长度,区间内交错段的最大长度。向上转移比较容易。

然后是得到最后的操作序列。如果一个位置在当前位置由 $0$ 变成 $1$ 之后,在操作完后的序列中由 $0$ 变成了 $1$,那么可以认为这个位置在操作完后变成了当前改变的这个位置的值。而一个位置能影响到的位置,只有他改变完后所在的最长 $01$ 段和他左右两个 $1$ 所在的最长 $01$ 段。注意第二部分是很容易忽略掉的。具体影响的位置要根据 $01$ 段最外面的两边具体是 $0$ 还是 $1$ 进行分类讨论。找到他影响的区间后做一个区间 $\min$ 即可(因为可能之前的已经修改过去了),这部分可以用一个标记永久化的线段树实现。

提交记录