浅谈线段树分治

序言

本文介绍了 " 线段树分治 " 在 ( ext{OI}) 中的一些妙用。

写的很草率,神仙不要 D 我。

(~)

前置技能

线段树。

(~)

线段树分治

我们来看这样一个问题:

  • 有一些操作,每个操作只在 (l sim r) 的时间段内有效。
  • 有一些询问,每个询问某一个时间点所有操作的贡献。

我们考虑对 时间轴 建一棵线段树。

对于任意一个区间 ([l,r]) ,我们总是可以按线段树区间操作的方式,在线段树上划分出连续的 (mathcal{O(log n)}) 个区间。

我们将操作对应的时间区间 ([l,r]) ,划分成 (mathcal{O(log n)}) 个区间,对应到线段树的 (mathcal{O(log n)}) 个节点上。

按照 标记永久化 的思想,我们在每个节点上放一个 STL vector ,其挂着的是管理的区间内有效的操作集合。

这样一来,对于每个操作,我们就可以在这 (mathcal{O(log n)}) 个节点上直接挂上该操作。

我们发现我们只会在线段树上挂上 (mathcal{O(m log n)}) 个节点。

最后我们遍历一遍线段树,每到达了一个节点,就执行相应的操作(挂在该节点 vectot 上的操作),然后递归处理左右节点,到达叶子节点时计算贡献,回溯时撤销掉在该节点上进行的操作。

没错,这就是 线段树分治 的思想。不难发现,这是一个离线分治算法。

(~)

好题选讲

先咕着 ......

(~)

结语

希望本文对大家有所帮助。

[ exttt{Thanks} exttt{for} exttt{watching} ]

原文地址:https://www.cnblogs.com/cjtcalc/p/12434836.html