线段树分治

  • 万物皆可分治

例题引入:

动态加边、删边,询问两点联通状态(不要求在线,\(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\)

进行线段树分治即可

代码

posted @ 2022-08-17 21:09  zuytong  阅读(13)  评论(0编辑  收藏  举报