线段树分治
- 万物皆可分治
例题引入:
动态加边、删边,询问两点联通状态(不要求在线,\(n,m\le 1e5\))
询问联通状态,我们可以自然想到用并查集来维护
但问题就在于,并查集不能删边
比如我们加入边 \(1-2,2-3,1-3\),再删除 \(1-2\),问你 \(1-3\) 的联通性;由于并查集对加入 \(1-3\) 并不会操作,因此直接删除 \(1-2\) 会导致答案错误
但是,并查集可以进行撤销操作,具体来说,我要撤销上一步的加边,如果这次加边本来就对连通性没有影响,那我们就不用理它;否则,我们就将这次加边影响的两个点之间的边给直接删去即可
有了这个基础,我们考虑将所有操作离线下来,记录每条边它存在的时间戳范围,并以时间戳为下标建立一棵线段树,将加边操作都扔到线段树上
最后跑一遍线段树,跑到叶子结点时,计算当前时间戳的所有询问即可
(其实我是想讲怎么将二分图转化为并查集)
我们可知,一个图为二分图,那它就不能出现奇数环,即能被 01染色
我们考虑用扩展域并查集,顾名思义,就是将并查集点的个数增加几倍,用来表示一些性质
我们将一个结点分为两个点:奇点和偶点;每次连边时,就将 \(x\) 的奇点和 \(y\) 的偶点相连,\(x\) 的偶点和 \(y\) 的奇点相连
如果有某次连边,出现了 \(x\) 的奇点(或偶点)与 \(y\) 的奇点(或偶点)出现在同一个连通块内,说明就不是二分图了
这样,我们又将一次连边操作变成了两次并查集合并,套用上面的套路即可
注意并查集要使用按秩合并
CF1140F Extending Set of Points
令 \((x,y)\) 变成连接 \((x,y+Mx)\) (其中 \(Mx\) 表示最大点),其实就是用了扩展域并查集
然后记录并查集内 \(\le Mx\) 的点的个数 \(s1\),\(> Mx\) 的点的个数 \(s2\) ,显然这个并查集的贡献就是 \(s1\times s2\)
进行线段树分治即可