https://www.lydsy.com/JudgeOnline/problem.php?id=2049
线段树真神奇
题意:给出一波操作,拆边加边以及询问两点是否联通。
听说常规方法是在线LCT,留坑。
如果说这个删边的操作是删除上一条边,那这自然是可撤销并查集的模板题,直接在线维护就可以了。
但是问题在于删除边的顺序是不可能固定的,要知道并查集是不可以随意撤销的。
万万没想到还有更加高妙的手法。
首先可以证明一条边的存在一定是一段或者多段连续的区间。
建立一条时间节点长度的线段树,结点维护一个边集合,每个位置表示的是当前这个时间下存在了哪几条边。
将上述的边区间全部加入,和常规的线段树不一样,这个不需要lazy标记也不需要Pushdown到下属区间,为了节省时间和空间,对于1 - N区间的边来说,我们仅仅把1号结点加上这条边。
然后用dfs的方法,进入结点时加上这些边,离开的时候删除这些边,在线段树的叶子节点上,并查集维护的就是当前时间的状态,离线的query直接询问即可。
时间复杂度,加边的整个过程mlogm,询问的过程节点数mlogm * 并查集find操作logm = mlog2 m
#include