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. java项目上各种小问题

    md,出现好几次这种问题,还得上百度? 以此为证,再出现这种问题我就不信想不起来怎么解决!!!----清除不存在jar包 ok,第二个问题: 每个类上有无数个红叉,然而代码并没有问题 解决方案:run ...

  2. 实战网卡bond

    一.什么是网卡bond 所谓bond,就是把多个物理网卡绑定成一个逻辑上的网卡,使用同一个IP工作,在增加带宽的同时也可以提高冗余性,一般使用较多的就是来提高冗余,分别和不同交换机相连,提高可靠性,但 ...

  3. python--列表生成式--8

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 一.生成列表 要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我 ...

  4. PHP安全配置

    vi /etc/php.ini #编辑 date.timezone = PRC #在946行把前面的分号去掉,改为date.timezone = PRC disable_functions = pas ...

  5. HTML5里autofocus属性

    转载:http://www.webhek.com/html5-autofocus/ HTML5给我们带来了一大堆神奇的东西.以前需要用JavaScript和Flash完成的任务,例如表单校验,INPU ...

  6. 【NOI2011】【P1308】道路修建

    这题也太水了吧,为什么不是我这届的NOI(╯‵□′)╯︵┻━┻ 原题: 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都 ...

  7. Qt事件和信号的区别 .

    仔细来看,事件与信号其实并无多大差别,从我们对其需求上来说,都只要能注册事件或信号响应函数,在事件或信号产生时能够被通知到即可.但有一项区别在于,事件处理函数的返回值是有意义的,我们要根据这个返回值来 ...

  8. Python中strip()函数

    在python API中这样解释strip()函数:

  9. combobox select .change onSelect事件触发

    我现在要完成的功能是:有两个下拉框,当地一个下拉框选择了第一个选项时,第二个下拉框不可用,否则就可用. 用了jQuery easyUI提供的onSelect方法.如下:js文件:$('#select1 ...

  10. sed 神器

    1.  删除一行 sed -i "1d" sedtest.txt 删除 sedtest.txt   第一行 2.  插入一行 sed '1i\0 ' sedtest.txt  &g ...