[CF813F]Bipartite Checking

Bipartite Checking

题解

线段树分治的板子题。

根据时间加边与删边,如果直接维护这个图的话明显会T,当然只加边的画不会,但由于会删边,我们每次判图都必须跑一遍这个图,于是就需要O\left(nq),明显会T,于是就要用线段树分治来维护每个时间上的边。

我们建一棵树来维护每个时间的图,从根到叶子的链上构成的图就是叶子这个时间节点的图的状态。每次删边时,就在这条边存在的时间区间上加上这条边。这样就可以维护任意时间点的图,保证我们到任意点时只会有加边的操作,不会去删边。

至于如何判断二分图,我们在点上都是维护了一个只有加边动态图的,如果回溯的话只需要撤销最后加的那一条边。我们用一个带权并查集去维护这个图,而并查集维护的图又一定是一棵树,而加一条边是可以O\left(1 \right )解决的。为了避免卡并查集,还需要按秩合并去保证树高。

插入边时若这条边连接了两棵未连接的树,明显不会有关系,可如果形成了奇环的话那就肯定不是二分图了,而判奇环就只需要维护每个点的深度。

于是,就可以过这题了。

源码

#include<cstdio>
#inclu
posted @ 2020-05-15 11:52  StaroForgin  阅读(10)  评论(0)    收藏  举报  来源