[BZOJ3237][AHOI2013]连通图(分治并查集)
3237: [Ahoi2013]连通图
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 1736 Solved: 655
[Submit][Status][Discuss]Description
Input
Output
Sample Input
4 5
1 2
2 3
3 4
4 1
2 4
3
1 5
2 2 3
2 1 2Sample Output
Connected
Disconnected
ConnectedHINT
N<=100000 M<=200000 K<=100000
Source
在线LCT,离线CDQ。
考虑怎么使用CDQ,对于区间[L,R],先将不在[L,mid]而在[mid+1,R]中的边加入,递归到左半边,撤销,将不在[mid+1,R]而在[L,mid]中的边加入,再次递归,撤销。
一般带撤销并查集是不能路径压缩的,但其实压缩了也没关系,记录压缩之前的父亲就好。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=,M=;
struct P{ int u,v,tim; }e[N];
struct Q{ int c[],cnt; }q[N];
int top,n,m,T,tim,u,v,f[N],ans[N],stk1[M],stk2[M]; int find(int x){
if (f[x]==x) return x;
int y=find(f[x]);
if (y!=f[x]) stk1[++top]=x,stk2[top]=f[x],f[x]=y;
return y;
} void solve(int l,int r){
int Top=top;
if (l==r){
int flag=;
rep(i,,q[l].cnt)
if (find(e[q[l].c[i]].u)!=find(e[q[l].c[i]].v))
{ flag=; break; }
ans[l]=flag;
while (top!=Top) f[stk1[top]]=stk2[top],top--;
return;
}
int mid=(l+r)>>; tim++;
rep(i,l,mid) rep(j,,q[i].cnt) e[q[i].c[j]].tim=tim;
rep(i,mid+,r) rep(j,,q[i].cnt){
int x=q[i].c[j];
if (e[x].tim!=tim){
int u=find(e[x].u),v=find(e[x].v);
if (u!=v) stk1[++top]=u,stk2[top]=f[u],f[u]=v;
}
}
solve(l,mid); tim++;
while (top!=Top) f[stk1[top]]=stk2[top],top--;
rep(i,mid+,r) rep(j,,q[i].cnt) e[q[i].c[j]].tim=tim;
rep(i,l,mid) rep(j,,q[i].cnt){
int x=q[i].c[j];
if (e[x].tim!=tim){
int u=find(e[x].u),v=find(e[x].v);
if (u!=v) stk1[++top]=u,stk2[top]=f[u],f[u]=v;
}
}
solve(mid+,r);
} int main(){
freopen("bzoj3237.in","r",stdin);
freopen("bzoj3237.out","w",stdout);
scanf("%d%d",&n,&m); tim=;
rep(i,,m) scanf("%d%d",&e[i].u,&e[i].v);
scanf("%d",&T);
rep(i,,T){
scanf("%d",&q[i].cnt); int x;
rep(j,,q[i].cnt) scanf("%d",&x),q[i].c[j]=x,e[x].tim=tim;
}
rep(i,,n) f[i]=i;
rep(i,,m) if (e[i].tim!=tim){
int u=find(e[i].u),v=find(e[i].v);
if (u!=v) f[u]=v;
}
solve(,T);
rep(i,,T) if (ans[i]) puts("Connected"); else puts("Disconnected");
return ;
}
[BZOJ3237][AHOI2013]连通图(分治并查集)的更多相关文章
- 【CF576E】Painting Edges 线段树按时间分治+并查集
[CF576E]Painting Edges 题意:给你一张n个点,m条边的无向图,每条边是k种颜色中的一种,满足所有颜色相同的边内部形成一个二分图.有q个询问,每次询问给出a,b代表将编号为a的边染 ...
- 2018.09.30 bzoj4025: 二分图(线段树分治+并查集)
传送门 线段树分治好题. 这道题实际上有很多不同的做法: cdq分治. lct. - 而我学习了dzyo的线段树分治+并查集写法. 所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的 ...
- BZOJ_4025_二分图_线段树按时间分治+并查集
BZOJ_4025_二分图_线段树按时间分治+并查集 Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简 ...
- BZOJ3237:[AHOI2013]连通图(线段树分治,并查集)
Description Input Output Sample Input 4 5 1 2 2 3 3 4 4 1 2 4 3 1 5 2 2 3 2 1 2 Sample Output Connec ...
- 2018.10.01 bzoj3237: [Ahoi2013]连通图(cdq分治+并查集)
传送门 cdq分治好题. 对于一条边,如果加上它刚好连通的话,那么删掉它会有两个大集合A,B.于是我们先将B中禁用的边连上,把A中禁用的边禁用,再递归处理A:然后把A中禁用的边连上,把B中禁用的边禁用 ...
- bzoj3569 DZY Loves Chinese II & bzoj3237 [AHOI2013] 连通图
给一个无向连通图,多次询问,每次询问给 k 条边,问删除这 k 条边后图的连通性,对于 bzoj3237 可以离线,对于 bzoj3569 强制在线 $n,m,q \leq 500000,k \leq ...
- hdu_5354_Bipartite Graph(cdq分治+并查集判二分图)
题目链接:hdu_5354_Bipartite Graph 题意: 给你一个由无向边连接的图,问对于每一个点来说,如果删除这个点,剩下的点能不能构成一个二分图. 题解: 如果每次排除一个点然后去DFS ...
- BZOJ3237: [Ahoi2013]连通图
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3237 cdq分治+缩点. 可以每次处理的时候把除l~r之外的边的端点都连起来.然后去跑cdq分 ...
- BZOJ 4025: 二分图 [线段树CDQ分治 并查集]
4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hno ...
随机推荐
- markdown备忘
文章主要(99%)参考自:markdown基本语法 这是二级标题 这是加粗的文字 这是倾斜的文字` 这是引用的内容 这是引用的内容 以下是分割线: 超链接 列表内容1 列表内容2 列表内容3 1.列表 ...
- Nova 如何统计 OpenStack 资源
1.云计算的本质在于将硬件资源软件化,以达到快速按需交付的效果,最基本的计算.存储和网络基础元素并没有因此改变.就计算而言,CPU.RAM 和 DISK等依旧是必不可少的核心资源. 从源代码和数据库相 ...
- CSU-2110 Keeping Cool
题目链接 http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2110 题目 Description Kevin has just got ...
- table内容超出宽度时隐藏并显示省略标记
HTML中,一个表格,要达到二个条件: 1.内容多了不自动换行: 2.固定单元格宽度.如果内容超出,则隐藏: 如 果在IE下,只是写成<table style="table-layou ...
- tomcat集群和负载均衡的实现(session同步)
(一)环境说明 (1)服务器有4台,一台安装apache,三台安装tomcat (2)apache2.0.55.tomcat5.5.15.jk2.0.4.jdk1.5.6或jdk1.4.2 (3) ...
- 删除maven仓库中的lastUpdate文件
使用idea时导入hibernate 5.1.0的jar包,然后发现本地仓库中找不到该版本的jar 然后手贱 alt+enter 发现提示 update maven indices 然后以为更新就会好 ...
- Java8并行流使用注意事项
对于从事Java开发的童鞋来说,相信对于Java8的并行流并不陌生,没错,我们常常用它来执行并行任务,但是由于并行流(parallel stream)采用的是享线程池,可能会对我们的性能造成严重影响, ...
- poj 1932 XYZZY (最短路径)
XYZZY Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3105 Accepted: 887 Description ...
- 原 HBase 常用Shell命令
HBase 常用Shell命令 1.进入hbase shell console $HBASE_HOME/bin/hbase shell 如果有kerberos认证,需要事先使用相应的keytab进行一 ...
- ajax数据读取和绑定
如何进行ajax数据读取和绑定呢? 首先创建一个AJAX对象 实现数据绑定 实现隔行变色 编写表格排序的方法(实现按照年龄这一列进行排序) 通过文档碎片,把排序后的最新顺序,重新添加到tBody中(通 ...
.jpg)
.jpg)
.jpg)