题意

虽然没用线段树,但是仍然是线段树分治的思想。

考虑分治询问序列,假设当前在\([l,r]\),我们将\([1,l-1]\)和\([r+1,Q]\)的与\([l,r]\)内不重复的边都连上了。

先将\([mid+1,r]\)中与\([l,mid]\)不重复的边都连上,之后递归\([l,mid]\),再将之前的操作撤销,将\([l,mid+1]\)中与\([mid+1,r]\)不重复的边都连上,之后递归\([mid+1,r]\)。

发现当低递归到\([l,l]\)时,整个并查集正好是第\(l\)组询问的图的状态。

code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int maxm=2*1e5+10;
const int maxQ=1e5+10;
int n,m,Q,top;
int fa[maxn],size[maxn];
bool ans[maxn],check[maxm];
struct Edge{int u,v;}E[maxm];
struct node{int x,y,sizey;}sta[maxQ];
vector<int>edge[maxQ];
inline int read()
{
char c=getchar();int res=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')res=res*10+c-'0',c=getchar();
return res*f;
}
int find(int x){return fa[x]==x?x:find(fa[x]);}
inline void merge(int u,int v,bool op)
{
int x=find(u),y=find(v);
if(x==y)return;
if(size[x]>size[y])swap(x,y);
if(op)sta[++top]=(node){x,y,size[y]};
fa[x]=y;size[y]+=size[x];
}
inline void cut(int id)
{
int x=sta[id].x,y=sta[id].y;
fa[x]=x;size[y]=sta[id].sizey;
}
void solve(int l,int r)
{
if(l==r){ans[l]=(size[find(1)]==n);return;}
int now=top,mid=(l+r)>>1;
for(int i=mid+1;i<=r;i++)
for(unsigned int j=0;j<edge[i].size();j++)
check[edge[i][j]]=1;
for(int i=l;i<=mid;i++)
for(unsigned int j=0;j<edge[i].size();j++)
check[edge[i][j]]=0;
for(int i=mid+1;i<=r;i++)
for(unsigned int j=0;j<edge[i].size();j++)
if(check[edge[i][j]])merge(E[edge[i][j]].u,E[edge[i][j]].v,1);
solve(l,mid);
while(top>now)cut(top),top--;
for(int i=l;i<=mid;i++)
for(unsigned int j=0;j<edge[i].size();j++)
check[edge[i][j]]=1;
for(int i=mid+1;i<=r;i++)
for(unsigned int j=0;j<edge[i].size();j++)
check[edge[i][j]]=0;
for(int i=l;i<=mid;i++)
for(unsigned int j=0;j<edge[i].size();j++)
if(check[edge[i][j]])merge(E[edge[i][j]].u,E[edge[i][j]].v,1);
solve(mid+1,r);
while(top>now)cut(top),top--;
for(int i=l;i<=mid;i++)
for(unsigned int j=0;j<edge[i].size();j++)
check[edge[i][j]]=0;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)fa[i]=i,size[i]=1;
for(int i=1;i<=m;i++)E[i].u=read(),E[i].v=read();
Q=read();
for(int i=1;i<=Q;i++)
{
int k=read(),id;
while(k--)id=read(),edge[i].push_back(id);
}
for(int i=1;i<=n;i++)fa[i]=i,size[i]=1;
for(int i=1;i<=Q;i++)
for(unsigned int j=0;j<edge[i].size();j++)
check[edge[i][j]]=1;
for(int i=1;i<=m;i++)if(!check[i])merge(E[i].u,E[i].v,0);
solve(1,Q);
for(int i=1;i<=Q;i++)puts(ans[i]?"Connected":"Disconnected");
return 0;
}

luoguP5227 [AHOI2013]连通图的更多相关文章

  1. luoguP5227 [AHOI2013]连通图(线性基做法)

    题意 神仙哈希做法. 随便找个生成树,给每个非树边赋一个值,树边的值为所有覆盖它的边的值得异或和. 删去边集使得图不联通当且即当边集存在一个子集异或和为0,可以用线性基. 证明的话好像画个图挺显然的 ...

  2. BZOJ 3237: [Ahoi2013]连通图

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

  3. BZOJ 3237([Ahoi2013]连通图-cdq图重构-连通性缩点)

    3237: [Ahoi2013]连通图 Time Limit: 20 Sec   Memory Limit: 512 MB Submit: 106   Solved: 31 [ Submit][ St ...

  4. [BZOJ3237][AHOI2013]连通图(分治并查集)

    3237: [Ahoi2013]连通图 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1736  Solved: 655[Submit][Status ...

  5. 线段树分治初步学习&洛谷P5227[AHOI2013]连通图

    线段树分治 其实思想说起来是比较简单的,我们把这个题里的所有操作(比如连边删边查询balabala)全部拍到一棵线段树上,然后对着整棵树dfs一下求解答案,顺便把操作做一下,回溯的时候撤销一下即可.虽 ...

  6. 【线段树分治】【P5227】 [AHOI2013]连通图

    Description 给定一个无向连通图和若干个小集合,每个小集合包含一些边,对于每个集合,你需要确定将集合中的边删掉后改图是否保持联通.集合间的询问相互独立 定义一个图为联通的当且仅当对于任意的两 ...

  7. bzoj3569 DZY Loves Chinese II & bzoj3237 [AHOI2013] 连通图

    给一个无向连通图,多次询问,每次询问给 k 条边,问删除这 k 条边后图的连通性,对于 bzoj3237 可以离线,对于 bzoj3569 强制在线 $n,m,q \leq 500000,k \leq ...

  8. BZOJ3237: [Ahoi2013]连通图

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3237 cdq分治+缩点. 可以每次处理的时候把除l~r之外的边的端点都连起来.然后去跑cdq分 ...

  9. 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 ...

随机推荐

  1. 第6次作业--static关键字、对象

    题目1:编写一个类Computer,类中含有一个求n的阶乘的方法.将该类打包,并在另一包中的Java文件App.java中引入包,在主类中定义Computer类的对象,调用求n的阶乘的方法(n值由参数 ...

  2. 【西北师大-2108Java】第六次作业成绩汇总

    [西北师大-2108Java]第六次作业成绩汇总 作业题目 面向对象程序设计(JAVA) 第8周学习指导及要求 实验目的与要求 (1)掌握接口定义方法: (2)掌握实现接口类的定义要求: (3)掌握实 ...

  3. ubuntu下使用redshift开启护眼模式

    前面提到flux这东西在一些机器上并不能work,而且也找到了一些关于他不能work的线索(戳这里看原因).根据这些线索我们发现用flux不行了,得换用redshift,那好吧,我们就来装redshi ...

  4. 你知道Java要注意技术点吗?

    关于Java的编程常识,有人会问哪几个是重要的常识点,不知道咱们是否知道呢?给咱们同享一下. 1.JVM相关(包含了各个版其他特性) 关于刚刚触摸Java的人来说,JVM相关的常识纷歧定需求了解很深, ...

  5. 给那些迷茫的人学习JAVA的一些建议?

    前语:我用了3年的时间,一步一步走到了现在,半途也有了解过其他的技能,也想过要转其他的言语,可是最终仍是坚持下来走Java这条路,希望我的经历能够帮忙到后来的人,要是觉得对你有帮忙的话,能够注重一下和 ...

  6. Repair Microsoft.VisualStudio.MinShell.Msi.Resources 2203 error And visual studio 2019 key

    1. Go to the properties of "My computer" 2. Go to advanced settings of the system 3. Go to ...

  7. pytest框架优化——清理历史截图图片和allure报告文件

    痛点分析: 当我们每次执行完用例的时候,如果出现bug或者是测试脚本出了问题,一般会通过测试报告.异常截图.日志来定位分析,但是我们发现运行次数多了之后,异常截图和测试报告会不停地增多,对我们定位分析 ...

  8. D - Ugly Problem HDU - 5920

    D - Ugly Problem HDU - 5920 Everyone hates ugly problems. You are given a positive integer. You must ...

  9. C++ 类的static静态成员

    静态static 静态成员的提出是为了解决数据共享的问题.实现共享有许多方法,如:设置全局性的变量或对象是一种方法.但是,全局变量或对象是有局限性的. 在全局变量前,加上关键字static该变量就被定 ...

  10. 转载:点云上实时三维目标检测的欧拉区域方案 ----Complex-YOLO

    感觉是机器翻译,好多地方不通顺,凑合看看 原文名称:Complex-YOLO: An Euler-Region-Proposal for  Real-time 3D Object Detection ...