序言
本文介绍了 " 线段树分治 " 在 ( 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}
]