题意
- 给你 n n n个点, m m m条边,每条边有一个出现时间和一个消失时间,求出每一个时刻当前图是否为二分图( n ≤ 1 0 5 , m ≤ 2 × 1 0 5 n\le10^5,m\le2\times10^5 n≤105,m≤2×105)。
感谢Inspector_Javert的这篇博客,让我看懂了什么是线段树分治。
首先我们要知道如何判定一个图是不是二分图,那就是这个图不存在奇环。然后我们可以以时间为轴建立线段树,把每条边放到线段树中,由线段树的性质我们可以知道每条边最多出现 log n \log n logn次,然后我们深搜这棵时间线段树,每次把路径上的所有节点上的所有边全部加入,然后判定当前图是不是二分图,那么现在问题就被我们转化成了给定一些边(支持删除)的二分图判定问题,我们考虑来解决这个问题。
我们可以用一个按秩合并的带权并查集来实现,每个点记录到父亲的树上距离,每次在连通图上加边时判定路径长度奇偶性即可,每次加入一条边 ( x , y ) (x,y) (x,y)时,设 x x x在并查集的根节点为 u u u, y y y在并查集的根节点为 v v v,那么 u u u到 v v v的距离就是 u − x