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

Connected

Disconnected

Connected

HINT

N<=100000 M<=200000 K<=100000

分析:
对于询问建一棵线段树,每个节点开一个vector记录这些询问需要的边。
然后线段树分治。
一开始先把所有询问都不需要的边插入并查集。
然后询问左儿子时,把右儿子询问边但不是左儿子的询问边插入并查集,然后分治左儿子,做完后撤回。
右儿子同理。
判断是否连通只需要判断当前的集合大小是否为n。

代码:

/**************************************************************Problem: 3237User: ypxrainLanguage: C++Result: AcceptedTime:10724 msMemory:51212 kb
****************************************************************/#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>const int maxn=2e5+7;using namespace std;int n,m,T,cnt;
int a[maxn][5],ans[maxn],p[maxn],size[maxn],h[maxn][2];
bool b[maxn];struct edge{int x,y;
}g[maxn];vector <int> t[maxn*4];int find(int x)
{if (!p[x]) return x;return find(p[x]);
}void uni(int x,int y)
{int u=find(x),v=find(y);if (u==v) return;if (size[u]>size[v]) swap(u,v);p[u]=v;size[v]+=size[u];h[++cnt][0]=u;h[cnt][1]=v;
}void cut(int x,int y)
{p[x]=0;size[y]-=size[x];
}void build(int p,int l,int r)
{if (l==r){for (int i=1;i<=a[l][0];i++) t[p].push_back(a[l][i]);return;}int mid=(l+r)/2;build(p*2,l,mid);build(p*2+1,mid+1,r);for (int i=0;i<t[p*2].size();i++){int x=t[p*2][i];b[x]=1;t[p].push_back(x);}for (int i=0;i<t[p*2+1].size();i++){int x=t[p*2+1][i];if (!b[x]) t[p].push_back(x);}for (int i=0;i<t[p*2].size();i++){int x=t[p*2][i];b[x]=0;}
}void solve(int p,int l,int r)
{if (l==r){int c=find(1);if (size[c]==n) ans[l]=1;else ans[l]=0;return;}int mid=(l+r)/2;for (int i=0;i<t[p*2].size();i++){int x=t[p*2][i];b[x]=1;}int now=cnt;for (int i=0;i<t[p*2+1].size();i++){int x=t[p*2+1][i];if (!b[x]) uni(g[x].x,g[x].y);}for (int i=0;i<t[p*2].size();i++){int x=t[p*2][i];b[x]=0;}solve(p*2,l,mid);for (int i=cnt;i>now;i--) cut(h[i][0],h[i][1]);cnt=now;for (int i=0;i<t[p*2+1].size();i++){int x=t[p*2+1][i];b[x]=1;}for (int i=0;i<t[p*2].size();i++){int x=t[p*2][i];if (!b[x]) uni(g[x].x,g[x].y);}for (int i=0;i<t[p*2+1].size();i++){int x=t[p*2+1][i];b[x]=0;}solve(p*2+1,mid+1,r);for (int i=cnt;i>now;i--) cut(h[i][0],h[i][1]);cnt=now;
}void prework()
{for (int i=1;i<=n;i++) size[i]=1;for (int i=0;i<t[1].size();i++){int x=t[1][i];b[x]=1;}for (int i=1;i<=m;i++){if (!b[i]) uni(g[i].x,g[i].y);else b[i]=0;}
}int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=m;i++) scanf("%d%d",&g[i].x,&g[i].y);scanf("%d",&T);for (int i=1;i<=T;i++){scanf("%d",&a[i][0]);for (int j=1;j<=a[i][0];j++) scanf("%d",&a[i][j]);}   build(1,1,T);prework();solve(1,1,T);for (int i=1;i<=T;i++){if (ans[i]) printf("Connected\n");else printf("Disconnected\n");}
}

bzoj 3237: [Ahoi2013]连通图 并查集+线段树分治相关推荐

  1. 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)

    题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...

  2. 线段树分治 ---- CF1217F - Forced Online Queries Problem(假离线 可撤销并查集 + 线段树分治)详解

    题目链接 题目大意 解题思路: 我一开始想到可以用可撤销并查集去维护这种删边加边的操作,但是有个缺点是每次撤销都有把后面的边全部撤销复度是O(n2)O(n^2)O(n2) 首先我们考虑这种动态加边删边 ...

  3. 【BZOJ4025】二分图(可撤销并查集+线段树分治)

    题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...

  4. BZOJ 3910 并查集+线段树合并

    思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...

  5. 暑期集训5:并查集 线段树 练习题G: HDU - 1754

    2018学校暑期集训第五天--并查集 线段树 练习题G  --   HDU - 1754 I Hate It 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.  这让 ...

  6. 暑期集训5:并查集 线段树 练习题F:  HDU - 1166 ​​​​​​​

    2018学校暑期集训第五天--并查集 线段树 练习题F  --   HDU - 1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A ...

  7. 暑期集训5:并查集 线段树 练习题B: HDU - 1213 ​​​​​​​

    2018学校暑期集训第五天--并查集 线段树 练习题B  --   HDU - 1213 How Many Tables Today is Ignatius' birthday. He invites ...

  8. 暑期集训5:并查集 线段树 练习题A:  HDU - 1232 ​​​​​​​

    2018学校暑期集训第五天--并查集 线段树 练习题A  --   HDU - 1232 畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅 ...

  9. UVA1455 - Kingdom(并查集 + 线段树)

    UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...

  10. BZOJ 3237: [Ahoi2013]连通图

    3237: [Ahoi2013]连通图 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1161  Solved: 399 [Submit][Stat ...

最新文章

  1. win10输入法切换快捷键怎么设置
  2. java文件操作和_JAVA文件操作类和文件夹的操作
  3. 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第六集
  4. 如何在linux里面运行ncl,NCL基础讲解(二)——NCL安装与运行
  5. wifi信号手机测试软件,专业的WiFi检测工具有哪些?如何解决wifi信号不好?
  6. D3D 光照和材料 小样例
  7. Winform GDI+
  8. 第15章-使用远程服务
  9. IE浏览器,ajax提示错误“no transport”
  10. 南方cass字体样式设置_实用|史上最全CASS字体异常的解决方案来啦!
  11. 2021低压电工考试题初训复审
  12. MarkDown 和LaTex语法学习(基于软件Typora)
  13. Qhsusb Dload驱动
  14. 《时代周刊》:投资者为何争相购买虚拟土地?
  15. 接口自动化测试实践指导(上):接口自动化需要做哪些准备工作
  16. 关于anaconda
  17. math_高阶导数求导法则和公式
  18. HTTP status Code 412 未满足前提条件的解决方法之一
  19. 看完这篇 教你玩转渗透测试靶机vulnhub——DC1
  20. 计算机基础课程的金课,我校8门课程获批省级线上“金课”

热门文章

  1. WPF子线程更新UI
  2. Java基础内容整理(一)
  3. spyder替换_Spyder快捷键
  4. JTXQ、JTT部标模拟终端使用说明 --3 报警及报警附件
  5. 关于el-dialog中@close事件和取消确认按钮并用,会触发两次关闭表单的操作(!表单为子组件时)
  6. SAT(Separating Axis Theorem)翻译
  7. 第二章 指令:计算机的语言
  8. 新手 RISC-V 编程的几点内容
  9. glsl 抗锯齿锯齿_什么是抗锯齿?
  10. Android studio 之 Kotlin Not Configured