Luogu5066 [Ynoi2014] 人人本着正义之名

题意:维护一个长为 01序列 ,有如下 个操作:

  • 把区间 的数变成
  • 把区间 的数变成
  • 内所有数 ,变为 按位或的值,这些数同时进行这个操作。
  • 内所有数 ,变为 按位或的值,这些数同时进行这个操作。
  • 内所有数 ,变为 按位与的值,这些数同时进行这个操作。
  • 内所有数 ,变为 按位与的值,这些数同时进行这个操作。
  • 查询区间 的和。

强制在线,,时限 ,空限


不难发现,操作相当于“区间内的 连续段向 左/右 扩展一位”.

用平衡树维护极长 连续段的左端点,以及颜色。

当某个颜色扩展时,若存在长度为 的另一种颜色的连续段,则需要将其删除,并将两侧的连续段合并。(需要特殊考虑边界情况)

若某棵子树中不存在删除事件,则可以打标记维护。标记有两种 :“颜色 前扩, 后缩”。

维护 段的个数,两类段的最短长度(若不存在则为 ,用于判定是否有删除事件),以及和。

连续段的个数是 的,于是花费在删除事件上的额外复杂度可以保证。

实现中用 leafy-Tree 维护。复杂度