3069: [Pa2011]Hard Choice 艰难的选择
Description
Byteasar是一个很纠结的人。每次他经过Bytetown的时候都知道有至少2条不同的路径可以选择,这导致他必须花很长时间来决定走哪条路。Byteasar最近听说了Bytetown的修路计划,他可能是唯一一个为此感到高兴的人——他有机会消除他的烦恼。
在Byteasar一共有n个岔口,连接着m条双向道路。两条路径完全不同当且仅当他们没有公共的道路(但是允许经过相同的岔口)。
Byteasar想知道:对于两个岔口x y,是否存在一对完全不同的路径。
Input
第一行3个整数:n, m, z (2<=n<=100000, 1<=m,z<=100000),分别代表:n个岔口,m条边,事件数z。岔口编号为1~n。
下面m行:ai, bi (1<=ai,bi<= n, ai!=bi),描述一条边
然后下面z行描述事件:ti, ci, di (t='Z' or 'P', 1<=ci,di<=n, ci!=di)。事件按照时间排序。
- 当
t='Z',表示删除一条边(ci, di),保证这条边之前没有被删除。注意,边可以被全部删除! - 当
t='P',询问是否存在从ci到di的一对完全不同的路径。
Output
对于每组询问,如果存在,输出TAK,否则输出NIE。
逆着操作顺序加边,同时并查集维护连通性和边双连通分量
预处理出按加边顺序得到的生成森林,在上面把每个连通块定向为有根树并标上深度
正式加边时,若两侧不连通则标为联通,否则将边的两端在生成树上的路径并成同一个边双连通分量
查询时可以直接判断两点是否在同个边双连通分量内
#include<bits/stdc++.h>
char buf[],*ptr=buf-;
int _(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
int _o(){
int c=*++ptr;
while(c<'A'||c>'Z')c=*++ptr;
return c;
}
const int N=;
int es[N*],enx[N*],ev[N*],e0[N],ep=,del[N];
int n,m,q,qs[N][],f1[N],f2[N],fa[N],ap=,dep[N];
bool ed[N],as[N];
int get(int*f,int x){
int a=x,c;
while(x!=f[x])x=f[x];
while(x!=f[a])c=f[a],f[a]=x,a=c;
return x;
}
struct edge{
int a,b,id;
bool operator<(edge e)const{return a!=e.a?a<e.a:b<e.b;}
void chk(){
int x=get(f1,a),y=get(f1,b);
if(x!=y){
f1[x]=y;
ev[id<<]=ev[id<<|]=;
}
}
void ins(){
int x=get(f1,a),y=get(f1,b);
if(x!=y){
f1[x]=y;
return;
}
a=get(f2,a);b=get(f2,b);
while(a!=b){
if(dep[a]<dep[b])b=f2[b]=get(f2,fa[b]);
else a=f2[a]=get(f2,fa[a]);
}
}
}e[N];
void dfs(int w){
ed[w]=;
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(!ed[u]&&ev[i])fa[u]=w,dep[u]=dep[w]+,dfs(u);
}
}
void ae(){
int a=_(),b=_();
if(a>b)std::swap(a,b);
e[ep>>]=(edge){a,b,ep>>};
es[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
es[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
}
void query(int a,int b){
as[ap++]=(get(f2,a)==get(f2,b));
}
int main(){
fread(buf,,sizeof(buf),stdin);
n=_();m=_();q=_();
for(int i=;i<=m;++i)ae();
std::sort(e+,e+m+);
for(int i=,a,b;i<=q;++i){
if(qs[i][]=(_o()=='Z')){
a=_();b=_();
if(a>b)std::swap(a,b);
a=std::lower_bound(e+,e+m+,(edge){a,b})-e;
++del[a];
qs[i][]=a;
}else{
qs[i][]=_();
qs[i][]=_();
}
}
for(int i=;i<=n;++i)f1[i]=i;
for(int i=;i<=m;++i){
while(del[i])i+=del[i];
if(i<=m)e[i].chk();
}
for(int i=q;i;--i)if(qs[i][])e[qs[i][]].chk();
for(int i=;i<=n;++i)if(!ed[i])dfs(i);
for(int i=;i<=n;++i)f1[i]=f2[i]=i;
for(int i=;i<=m;++i){
while(del[i])i+=del[i];
if(i<=m)e[i].ins();
}
for(int i=q;i;--i)if(qs[i][])e[qs[i][]].ins();else query(qs[i][],qs[i][]);
while(ap)puts(as[--ap]?"TAK":"NIE");
return ;
}
3069: [Pa2011]Hard Choice 艰难的选择的更多相关文章
- BZOJ3069: [Pa2011]Hard Choice 艰难的选择
Description Byteasar是一个很纠结的人.每次他经过Bytetown的时候都知道有至少2条不同的路径可以选择,这导致他必须花很长时间来决定走哪条路.Byteasar最近听说了Bytet ...
- UVA 1175 Ladies' Choice 女士的选择(稳定婚姻问题,GS算法)
题意: 给出每个男的心目中的女神排序,给出每个女的心目中的男神排序,即两个n*n的矩阵,一旦任意两个非舞伴的男女同学觉得对方都比现任舞伴要好,他们就会抛弃舞伴而在一起.为了杜绝这种现象,求每个男的最后 ...
- 题解 洛谷 P6351 【[PA2011]Hard Choice】
删边操作不好处理,所以先将操作倒序,将删边转化为加边. 考虑对于两个点的询问,若这两点不连通或这两个点分别处于两个不同的边双连通分量中(两点间存在桥)时,是不满足题目要求的. 可以用\(LCT\)来维 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 6个原因说服你选择PostgreSQL9.6
PostgreSQL9.6在前些日子发布了, 社区为该版本的重大更新付诸良多, 发布日志一如既往的长,我挑选了6个重要的更新, 这些或许能够帮助你更好的使用PostgreSQL. 并行: 并行应该是这 ...
- 选择——ERP信息系统选型
做一次选择并不难,难的是做一次坚定而正确的选择.TCL电脑公司的ERP软件选型就是一次正确而艰难的选择过程.让我们从头说起吧! 业界都知道TCL电脑是IT行业的新入行者,更知道TCL的另一个诠释:& ...
- python random从集合中随机选择元素
1.使用python random模块的choice方法随机选择某个元素 from random import choice foo = ['a', 'b', 'c', 'd', 'e'] print ...
- Python switch(多分支选择)的实现
Python 中没有 switch/case 语法,如果使用 if/elif/else 会出现代码过长.不清晰等问题. 而借助字典就可以实现 switch 的功能 示例: def case1(): # ...
- Django框架(十一)-- 补充:inclusion_tag、defer、only、choice、事务、创建多对多的第三张表、mvc和mtv模式
一.inclusion_tag 1.作用 用于生成HTML片段,是数据由参数传入而变成动态 2.使用 # 1.app下新建一个模块,templatetags # 2.创建一个py文件(mytag.py ...
随机推荐
- PHP stripos()、strripos()和strrpos() 使用方法和区别
区别 stripos():查找字符串首次出现的位置(不区分大小写) 写法:stripos ( string $haystack , string $needle [, int $offset = 0 ...
- js面向对象之:创建对象
最近在学习<js高级程序设计>,之前所接触的很多的js类库和jQuery插件都会用面向对象的方式来设计,而自己却还是停留在面向方法的阶段,所以今天好好记录一下学习的js创建对象. 第一种方 ...
- 自己WIN7旗舰版安装 SQLServer2005/2008的一些总结
准备工作:下载安装包,当然要保证安装包能用: 安装:1.设置setup.exe文件 右键属性选择 --兼容,兼容下面选择---以管理员方式运行,---兼容模式选择windows xp或者windows ...
- Lodash 浓缩
Lodash 是个十分有用的工具库,但我们往往只需要其中的一小部分函数.这时,整个 lodash 库就显得十分庞大,我们需要减小 lodash 的体积. cherry-pick 方法 Lodash 官 ...
- 【跟着stackoverflow学Pandas】add one row in a pandas.DataFrame -DataFrame添加行
最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...
- ROS机器人操作系统官方教程、源码汇总
1 wiki: http://wiki.ros.org/ 2 code: https://github.com/ ---- 1 基础教程 https://github.com/ros/ros_tut ...
- IOS开发 static关键字的作用
(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值: (2)在模块内的 static 全局变量可以被模块内所 ...
- Swift UIAlertController、UISegmentedControl
// MARK: 提示框 func _initAlertView() { let btn = UIButton(type: UIButtonType.ContactAdd) btn.frame = C ...
- redis常用配置参数解析
本文主要总结一下redis常用的配置参数的用法: 以下参数决定redis运行方式,默认前台运行,修改为yes可以让redis以后台守护进程方式运行 daemonize no 以下参数指定redis的p ...
- SEO - H标签
前言 这两天在做网站的SEO.虽然之前SEO的资料看过很多,但是因为正职是美工的缘故,SEO的具体实施参与的较少.现在的公司有点特殊,SEO团队基本不懂代码,所以需要参与的比较多.以下内容主要是通过自 ...