线段树与离线询问结合的问题在 OI 领域也有出现。这种技巧又被称为线段树分治。

假如你需要维护一些信息,这些信息会在某一个时间段内出现,要求在离线的前提下回答某一个时刻的信息并,则可以考虑使用线段树分治的技巧。

实际上线段树分治常有以下用途:

  1. 用原本不支持删除但是支持撤销的数据结构来模拟删除操作。如朴素的并查集无法高效支持删边操作。
  2. 不同属性的数据分别计算。如需要求出除了某一种颜色外,其他颜色数据的答案。

如果大家现在不明白没有关系,这两种用途我们都会在例题中阐述。

过程

首先我们建立一个线段树来维护时刻,每一个节点维护一个 vector 来存储位于这一段时刻的信息。

插入一个信息到线段树中和普通线段树的区间修改是类似的。

然后我们考虑如何处理每一个时间段的信息并。考虑从根节点开始分治,维护当前的信息并,然后每到一个节点的时候将这个节点的所有信息进行合并。回溯时撤销这一部分的贡献。最后到达叶子节点时的信息并就是对应的答案。

如果更改信息的时间复杂度为 ,可以通过设置一个栈保留更改,以 的时间复杂度撤销。撤销不维持均摊复杂度。

整个分治流程的总时间复杂度是 的,其中 为合并信息的时间复杂度,空间复杂度为

例题

你需要维护一个 个点 条边的无向图。第 条边为 ,出现的时刻为 ,其余时刻消失。

对于每一个时刻,若此时该图为二分图,输出 Yes,否则输出 No

颜色限制 restriction

一个 边的无向图,有 种颜色编号为 ,每条边有一种颜色。

对于每种颜色,请判断假如删去所有这种颜色的边,得到的图是否连通?是否是一棵树?

输出满足删去后图连通的颜色数和删去后图是树的颜色数。

需要维护一个 个点的森林,初始时是散点。

个操作,支持:

  • A x y 连边
  • Q x y 输出经过边 的路径数。

允许离线。

出一个 个点的树,每个点有黑白两种颜色。初始时每个点都是黑色的。 次操作,支持:

  • C x 将第 个点的颜色反转。
  • G 询问树上两个黑色点的最远距离。特别地,若不存在黑色点,输出

允许离线。

习题

本页面部分内容参考自博文 Deleting from a data structure,版权协议为 CC-BY-SA 4.0。

此文件夹下有0条笔记。