Description

现在,我想知道自己是否还有选择。
给定n个点m条边的无向图以及顺序发生的q个事件。
每个事件都属于下面两种之一:
1、删除某一条图上仍存在的边
2、询问是否存在两条边不相交的路径可以从点u出发到点v

Input

第一行三个整数n,m,q
接下来m行,每行两个整数u,v,表示u和v之间有一条边
接下来q行,每行一个大写字母o和2个整数u、v,依次表示按顺序发生的q个事件:
当o为’Z’时,表示删除一条u和v之间的边
当o为’P’时,表示询问是否存在两条边不相交的路径可以从点u出发到点v

Output

对于每组询问,如果存在,输出Yes,否则输出No
倒着模拟,首先求出所有操作后的连通块并缩点,按删边倒序对缩点后的图加边(A)但保证不成环,过程并查集维护
保留连通块内的边和A类边,dfs一次求出某棵生成树内每个点的深度和父节点,顺便对每个连通块(所有操作后的,不包含A边)用tarjan求边双连通分量
再一次倒序加边,此时并查集维护每个点所属边双连通分量内深度最小的点,加边时在树上求lca并沿路径缩点(整条路径加边后成为同一边双连通分量)
#include<cstdio>
#include<algorithm>
const int N=,M=;
char buf[M+],*ptr=buf-;
inline int _int(){
int x=,c=*++ptr;
while(c>||c<)c=*++ptr;
while(c>&&c<)x=x*+c-,c=*++ptr;
return x;
}
inline int getop(){
int c=*++ptr;
while(c<'A'||c>'Z')c=*++ptr;
return c;
}
struct edge{int a,b;}e[];
bool operator<(edge a,edge b){
return a.a!=b.a?a.a<b.a:a.b<b.b;
}
int n,m,q;
int qs[N][];
bool ans[N];
int del[N];
int es[N*],enx[N*],e0[N],ep=,f[N],F[N],F1[N],dep[N],fa[N];
int ed[N*];
int dfn[N],low[N],T=;
int get(int x){
int a=x,c;
while(x!=f[x])x=f[x];
while(x!=(c=f[a]))f[a]=x,a=c;
return x;
}
int Get(int x){
int a=x,c;
while(x!=F[x])x=F[x];
while(x!=(c=F[a]))F[a]=x,a=c;
return x;
}
void swap(int&a,int&b){int c=a;a=b;b=c;}
void tj(int w){
dfn[w]=low[w]=++T;
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(ed[i]){
if(ed[i]==&&!dfn[u]){
dep[u]=dep[w]+;
fa[u]=w;
tj(u);
}
continue;
}
if(!dfn[u]){
ed[i^]=;
dep[u]=dep[w]+;
fa[u]=w;
tj(u);
if(low[u]<low[w])low[w]=low[u];
if(low[u]<=dfn[w])f[get(u)]=get(w);
}else if(dfn[u]<low[w])low[w]=dfn[u];
}
}
int main(){
fread(buf,,M,stdin);
n=_int();m=_int();q=_int();
for(int i=;i<m;i++){
int a=_int(),b=_int();
if(a>b){int c=a;a=b;b=c;}
e[i]=(edge){a,b};
}
std::sort(e,e+m);
for(int i=;i<=q;i++){
qs[i][]=(getop()=='Z');
int a=qs[i][]=_int();
int b=qs[i][]=_int();
if(qs[i][]){
if(a>b)swap(a,b);
edge w=(edge){a,b};
++del[std::lower_bound(e,e+m,w)-e];
}
}
for(int i=;i<=n;i++)F[i]=f[i]=i;
for(int i=;i<m;i++){
if(del[i]>)for(int j=,c=del[i];j<c;j++)del[i+j]=;
if(del[i])continue;
int a=e[i].a,b=e[i].b;
es[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
es[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
F[Get(a)]=Get(b);
}
for(int i=;i<=n;i++)F1[i]=F[i];
for(int i=q;i;i--)if(qs[i][]){
int a=qs[i][],b=qs[i][];
if(Get(a)==Get(b))continue;
ed[ep]=;es[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
ed[ep]=;es[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
F[Get(a)]=Get(b);
}
for(int i=;i<=n;i++)if(!dfn[i])tj(i);
for(int i=;i<=n;i++)F[i]=F1[i];
for(int i=q;i;i--){
int a=qs[i][],b=qs[i][];
if(qs[i][]){
if(Get(a)!=Get(b)){
if(dep[a]<dep[b])swap(a,b);
fa[a]=b;
F[Get(a)]=Get(b);
continue;
}
a=get(a);b=get(b);
while(a!=b){
if(dep[a]<dep[b])swap(a,b);
f[a]=get(fa[a]);
a=fa[a];
}
}else ans[i]=(get(a)==get(b));
}
for(int i=;i<=q;i++)if(!qs[i][])puts(ans[i]?"Yes":"No");
return ;
}

bzoj4229: 选择的更多相关文章

  1. BZOJ4229选择——LCT+并查集+离线(LCT动态维护边双连通分量)

    题目描述 现在,我想知道自己是否还有选择. 给定n个点m条边的无向图以及顺序发生的q个事件. 每个事件都属于下面两种之一: 1.删除某一条图上仍存在的边 2.询问是否存在两条边不相交的路径可以从点u出 ...

  2. 【bzoj4229】选择 离线+LCT

    题目描述 现在,我想知道自己是否还有选择. 给定n个点m条边的无向图以及顺序发生的q个事件. 每个事件都属于下面两种之一: 1.删除某一条图上仍存在的边 2.询问是否存在两条边不相交的路径可以从点u出 ...

  3. Atitit 项目语言的选择 java c#.net  php??

    Atitit 项目语言的选择 java c#.net  php?? 1.1. 编程语言与技术,应该使用开放式的目前流行的语言趋势1 1.2. 从个人职业生涯考虑,java优先1 1.3. 从项目实际来 ...

  4. 逆天通用水印支持Winform,WPF,Web,WP,Win10。支持位置选择(9个位置 ==》[X])

    常用技能:http://www.cnblogs.com/dunitian/p/4822808.html#skill 逆天博客:http://dnt.dkil.net 逆天通用水印扩展篇~新增剪贴板系列 ...

  5. 如何选择PHP框架?

    PHP是世界上最受欢迎的编程语言之—.最近发布的PHP7令这种服务器的编程语言比以前变得更好,更稳定了. PHP被广泛应用于重大的项目.例如Facebook就是使用PHP来维护和创建它们的内部系统的. ...

  6. CoreCRM 开发实录——开始之新项目的技术选择

    2016年11月,接受了一个工作,是对"悟空CRM"进行一些修补.这是一个不错的 CRM,开源,并提供一个 SaaS 的服务.正好微软的 .NET Core 和 ASP.NET C ...

  7. angular2系列教程(九)Jsonp、URLSearchParams、中断选择数据流

    大家好,今天我们要讲的是http模块的第二部分,主要学习ng2中Jsonp.URLSearchParams.observable中断选择数据流的用法. 例子

  8. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  9. Mysql存储引擎及选择方法

    0x00 Mysql数据库常用存储引擎 Mysql数据库是一款开源的数据库,支持多种存储引擎的选择,比如目前最常用的存储引擎有:MyISAM,InnoDB,Memory等. MyISAM存储引擎 My ...

随机推荐

  1. hdu 5207

    题目大意:给定一组数,取两个数,使得gcd最大.分析:先nlogn预处理出105所有数的因子,然后用cnt数组计数给定数的因子个数,再找到最大的i,满足cnt[i]>=2,复杂度为nlogn.学 ...

  2. Codeforces Round #372 (Div. 2)

    Codeforces Round #372 (Div. 2) C. Plus and Square Root 题意 一个游戏中,有一个数字\(x\),当前游戏等级为\(k\),有两种操作: '+'按钮 ...

  3. php文件遍历

    <?php $dirname="shangchuan/uploads"; echo $dirname."共计大小为:".toSize(dirsize($d ...

  4. P364 实战练习(多线程)

    尝试定义一个继承Thread类的类,并覆盖run( )方法,在run( )方法中每隔1000毫秒打印一句话. 编写代码如下: 编写PractiseThread类: package org.hanqi. ...

  5. NOSQL Benchmarks

    www.planetcassandra.org/nosql-performance-benchmarks/ http://www.planetcassandra.org/nosql-performan ...

  6. C#配置升级

    void ConvertProject() { List<BaseProjectConverter> convertors = new List<BaseProjectConvert ...

  7. int(M)与int

    int(M) ,加上zerofill后M才表现出有点效果,比如 int(3) zerofill,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0.如果int(3)和int(10 ...

  8. ECLIPSE中添加TPTP插件

    转自:http://blog.csdn.net/sinboy/article/details/1536625 程序在实际应用当中,大数据量时对系统本身的影响是一个不得不面对的问题. 最早在使用Jbui ...

  9. easyUI之Combo

    Combo组件为自定义下拉列表组件,无class的加载方式,主要是通过jquery的方式.它依赖于validatebox,可以用它的很多属性.例如: 前台: <div id="box& ...

  10. EDIUS工程里面的素材保存方法

    在实际使用EDIUS剪辑一段视频时,会有好多人问这样一个问题:EDIUS工程里面使用的素材不能自动复制到工程文件夹里面吗,难道要自己一个一个复制进去?面对这样的疑问,来看看小编是如何做的吧. 为了用户 ...