线段树分治学习笔记(未完待续)
简述
线段树分治解决一类具有撤销操作的问题。
与可持久化不同,可持久化在某个历史版本上做更改后不会影响到后续的结果,而这里的撤销操作会影响到后续的结果(即这是一个 ‘Retroactive Data Structure’ 而非 ‘Persistent Data Structure’,相关内容参看Eric Demaine的论文或者视频)。
为解决该问题,我们以时间为域建立一棵线段树,则所有的操作、询问对应了线段树上表示相关时间区间的一些节点。节点内储存解决问题需要的数据结构。
如此,倘若我们 $dfs$ 整棵线段树,并在路途中记录操作、在回溯时撤销操作,则到达线段树的每个叶节点时,我们就知道了在当前叶节点所表示的时刻,我们进行了哪些操作。
练习
[TJOI2018]数学计算
乍一看以为直接模拟,但是 $mod$ 不保证质数或者互质,处理逆元不方便。
转换思路,以时间为域建立线段树,节点存储该时间乘上的数。除掉某一次操作其实就是更改乘数为 $1$,所以单点修改区间查询即可。
1 |
|
luoguP5787 / bzoj4025二分图
每一条边对应着一段持续时间,即对应了线段树的若干节点。线段树的每个节点开一个 vector
,记录该节点时间段内存在的边,于是我们 $dfs$ 遍历整棵线段树,凡到达一个叶节点就能获知此时图中有哪些边。
由于一个图是二分图当且仅当该图不含奇环,我们只需要判断这些边是否形成奇环,这一点可以用带权并查集完成。回溯时需要撤掉边,所以带权并查集需要是可撤销的——开一个栈记录搜索过程中在并查集中加入了哪些边,回溯时弹栈撤掉这些边,此并查集不能路径压缩,所以要按秩合并以保证复杂度。
再多说一点带权并查集:带的权是一个点到其父节点在原图中的距离的奇偶性。当我们连接 $u,v$ 时,若它们同在一个并查集内且到并查集代表元素的距离同奇偶,则再连上 $(u,v)$ 这条边会导致奇环,输出 No
;若它们不在同一个并查集内,设 $u,v$ 各自并查集代表元素为 $x,y$,则我们在并查集中实际上连接的是 $(x,y)$,这条边的权是 $(x,y)$ 在原图中的距离奇偶性,即 $x$ 到 $u$ 的距离奇偶性异或 $y$ 到 $v$ 的距离奇偶性异或 $1$.
时间复杂度:$O(k\lg k\lg n)$
1 |
|
「LibreOJ Round #6」花团
线段树每个节点开一个 vector
,记录该节点时间段内有哪些物品。然后 $dfs$ 整棵线段树,在搜索的过程中做 $01$ 背包,到达询问点就输出结果。
回溯撤销操作时,需要把 $dp$ 数组置为上一层的 $dp$ 数组,所以 $dp$ 数组开成二维的,以线段树层数为第一维。
复杂度:$O(vq\lg q)$ (不知为何就是可以过~)
1 |
|
线段树分治学习笔记(未完待续)