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. Sqlserver 还原那些事

    由于想总结的东西比较杂乱,就起了这么一个题目 1.当还原数据库,没有选择结尾日志备份时,会出现下图异常: 这是因为,对于使用完全恢复模式或大容量日志恢复模式的数据库,在大多数情况下,您必须在还原数据库 ...

  2. ZOJ 1048 Financial Management

    原题链接 题目大意:给出12个月的收入,求一个平均值. 解法:没什么好说的,就是一个除法. 参考代码: #include<stdio.h> int main(){ int i; float ...

  3. 学习chrome 插件 DHC ,http请求传参方法

    DHC的简介 DHC是一款可以帮助用户使用chrome插件模拟HTTP客户端发送测试数据到服务器的谷歌浏览器插件,在chrome中安装了DHC插件以后,就可在服务器端代码初步完成的时候,使用DHC进行 ...

  4. linux 网络协议分析---3

    本章节主要介绍linxu网络模型.以及常用的网络协议分析以太网协议.IP协议.TCP协议.UDP协议 一.网络模型 TCP/IP分层模型的四个协议层分别完成以下的功能: 第一层 网络接口层 网络接口层 ...

  5. leetcode 118 Pascal's Triangle ----- java

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...

  6. MySQL二进制日志的备份和恢复

    二进制日志:记录数据库修改的相关操作,作用是即时点回复,主从复制 可以按时间滚动,也可以按大小滚动 server-id:服务器身份标识 一.二进制文件的删除方法,千万不要手动删除 PURGE BINA ...

  7. glsl计算sprite的亮度饱和度对比度

    //glsl计算sprite的亮度饱和度对比度 #ifdef GL_ES precision mediump float; #endif uniform sampler2D u_texture; va ...

  8. 什么是HTML、XML和XHTML

    (1)XMLXML是The Extensible Markup Language(可扩展标识语言)的简写.目前推荐遵循的是W3C于2000年10月6日发布的XML1.0,参考(www.w3.org/T ...

  9. PHP strrpos strpos strstr strrchr 区别

    1. strstr string strstr ( string $haystack , mixed $needle [, bool $before_needle = false ] ) $needl ...

  10. “锁定”语句 lock(C# 参考)

    此文章由人工翻译. 将光标移到文章的句子上,以查看原文. 更多信息. 译文 原文 "锁定"语句(C# 参考) 其他版本 <?XML:NAMESPACE PREFIX = &q ...