传送门

cdq分治好题。


对于一条边,如果加上它刚好连通的话,那么删掉它会有两个大集合A,B。于是我们先将B中禁用的边连上,把A中禁用的边禁用,再递归处理A;然后把A中禁用的边连上,把B中禁用的边禁用。

这样递归下去用并查集维护答案就行了。

另外,当向上回溯时需要撤销之前的操作,因此需要用栈维护并查集历史信息。

代码:

#include<bits/stdc++.h>
#define N 100005
#define M 200005
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
int tot=0,n,m,k,fa[N],ans[N];
bool ban[M];
struct edge{int u,v;}tt[M],q[M*50];
vector<int>del[N];
inline int find(int x){
	if(x!=fa[x])q[++tot]=(edge){x,fa[x]},fa[x]=find(fa[x]);
	return fa[x];
}
inline void merge(int u,int v){
	int fx=find(u),fy=find(v);
	if(fx!=fy)q[++tot]=(edge){fy,fa[fy]},fa[fy]=fx;
}
inline void rec(int l,int r,int tmp){for(int i=l;i<=r;++i)for(int j=0;j<del[i].size();++j)ban[del[i][j]]=tmp;}
inline void add(int l,int r){
	for(int i=l;i<=r;++i)for(int j=0;j<del[i].size();++j){
		int pos=del[i][j];
		if(ban[pos])continue;
		merge(tt[pos].u,tt[pos].v);
	}
}
inline void clear(int tim){while(tot>tim)fa[q[tot].u]=q[tot].v,--tot;}
inline bool check(int p){
	for(int i=0;i<del[p].size();++i){
		int fx=find(tt[del[p][i]].u),fy=find(tt[del[p][i]].v);
		if(fx!=fy)return 0;
	}
	return 1;
}
inline void solve(int l,int r){
	if(l==r){ans[l]=check(l);return;}
	int mid=l+r>>1;
	int cnt=tot;
	rec(l,mid,1),add(mid+1,r),rec(l,mid,0),solve(l,mid);
	clear(cnt);
	rec(mid+1,r,1),add(l,mid),rec(mid+1,r,0),solve(mid+1,r);
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;++i)fa[i]=i;
	for(int i=1;i<=m;++i)tt[i].u=read(),tt[i].v=read();
	k=read();
	for(int i=1;i<=k;++i){
		int c=read();
		for(int j=1;j<=c;++j){
			int tmp=read();
			del[i].push_back(tmp);
		}
	}
	rec(1,k,1);
	for(int i=1;i<=m;++i)if(!ban[i])merge(tt[i].u,tt[i].v);
	rec(1,k,0),tot=0,solve(1,k);
	for(int i=1;i<=k;++i)puts(ans[i]?"Connected":"Disconnected");
	return 0;
}

2018.10.01 bzoj3237: [Ahoi2013]连通图(cdq分治+并查集)的更多相关文章

  1. 【openjudge】C15C Rabbit's Festival CDQ分治+并查集

    题目链接:http://poj.openjudge.cn/practice/C15C/ 题意:n 点 m 边 k 天.每条边在某一天会消失(仅仅那一天消失).问每一天有多少对点可以相互到达. 解法:开 ...

  2. BZOJ 4025: 二分图 [线段树CDQ分治 并查集]

    4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hno ...

  3. 【CF603E】Pastoral Oddities cdq分治+并查集

    [CF603E]Pastoral Oddities 题意:有n个点,依次加入m条边权为$l_i$的无向边,每次加入后询问:当前图是否存在一个生成子图,满足所有点的度数都是奇数.如果有,输出这个生成子图 ...

  4. hdu_5354_Bipartite Graph(cdq分治+并查集判二分图)

    题目链接:hdu_5354_Bipartite Graph 题意: 给你一个由无向边连接的图,问对于每一个点来说,如果删除这个点,剩下的点能不能构成一个二分图. 题解: 如果每次排除一个点然后去DFS ...

  5. [HDU5354]Bipartite Graph(CDQ分治+并查集)

    经典动态二分图问题. 考虑solve(l,r)分治成l,mid和mid+1,r.先将区间[mid+1,r]中的点全部加入图中,若此时存在奇环则ans[l..mid]全部为0,否则递归到左边. 递归完左 ...

  6. 2018.09.30 bzoj4025: 二分图(线段树分治+并查集)

    传送门 线段树分治好题. 这道题实际上有很多不同的做法: cdq分治. lct. - 而我学习了dzyo的线段树分治+并查集写法. 所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的 ...

  7. 【CF576E】Painting Edges 线段树按时间分治+并查集

    [CF576E]Painting Edges 题意:给你一张n个点,m条边的无向图,每条边是k种颜色中的一种,满足所有颜色相同的边内部形成一个二分图.有q个询问,每次询问给出a,b代表将编号为a的边染 ...

  8. 2015多校第6场 HDU 5354 Bipartite Graph CDQ,并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5354 题意:求删去每个点后图是否存在奇环(n,m<=1e5) 解法:很经典的套路,和这题一样:h ...

  9. BZOJ_4025_二分图_线段树按时间分治+并查集

    BZOJ_4025_二分图_线段树按时间分治+并查集 Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简 ...

随机推荐

  1. spring data jpa 注解

    @Data 注解引出的 lombok 小辣椒   今天在看代码的时候, 看到了这个注解, 之前都没有见过, 所以就查了下, 发现还是个不错的注解, 可以让代码更加简洁. 这个注解来自于 lombok, ...

  2. JPA和Hibernate到底是什么关系???

    转自:https://www.cnblogs.com/mosoner/p/9494250.html 在学习框架的过程中,发现学的东西很多,但是感觉他们之间的联系区别都不是很了解,知道JPA可以去实现持 ...

  3. as3 TweenMax TweenLite方法

    as3 TweenMax TweenLite方法补充(暂停.重新播放.倒序播放).现在来好好的学习一下:   TweenLite.to(mc, 1.5, {x:100}); 里面的mc指所作用的对象, ...

  4. idea常用设置(持续更新)

    1.注释模板 Setting里找到live Templates (1)创建一个Templates Group (2)在Templates Group下创建Live Template 2.常用内置模板 ...

  5. eclipse中maven多模块项目的创建、提交和检出

    1.创建父项目:maven项目.创建完成后删除src目录:删除项目属性java builder中的src目录. 2.在父项目中创建maven module子项目. 3.修改pom文件,添加依赖,修改g ...

  6. Haskell语言学习笔记(22)MaybeT

    Monad Transformers Monad 转换器用于将两个不同的Monad合成为一个Monad.Monad 转换器本身也是一个 Monad. MaybeT MaybeT 这个 Monad 转换 ...

  7. r.js打包

    久闻r.js的大名,但实际没有用它做过任何东西.今天用它时,发现网上许多教程都不对.研究一下,把我的实际经验分享给大家. 例子1 先是HTML页面 <!DOCTYPE html> < ...

  8. Unity C# 调用 C++ DLL 并在 DLL 中调用 C# 的回调函数

    Unity C# 调用 C++ DLL 并在 DLL 中调用 C# 的回调函数~~~    呵呵... 看着有点晕.. 再解释一下就是 在Unity中 使用 C# 调用 C++ 写的 DLL, 但是在 ...

  9. jQuery中的几个模块总结

    Query插件,以备并希望在前端方面有所长进.请批评指正. 一,类型判断全解 JQuery判断类型扩展方法:$.type() /*type: function( obj ) { if ( obj == ...

  10. 常见jsp跳转总结

    这次做项目,用到几种不同的JSP跳转的方式,在此总结5中常用方法. 常用的跳转方式有以下几种: (1)href超链接标记,属于客户端跳转 (2)使用javascript完成,属于客户端跳转 (3)提交 ...