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 ...
随机推荐
- 进程与网络监控和ssh简单使用
进程的概念和管理 进程: 正在执行的程序 线程: 轻量级的进程 进程有独立的地址空间,线程没有 线程不能独立存在,它是由进程创建.Thread1.在linux中,每个执行的程序都称为一个进程.每一个进 ...
- mybatis传入0但判断为空
当是数字类型时,传入0会判断为空,当值为空,显示在页面上的将会是0:
- VS2010上写QT代码,但是显示不出来QString的值-解决办法
我的配置是vs2010和qt,debug下看不到 QString的值 根据 http://www.cnblogs.com/russinovich/archive/2012/06/29/2569898. ...
- (转)MapReduce Design Patterns(chapter 6 (part 1))(十一)
Chapter 6. Metapatterns 这种模式不是解决某个问题的,而是处理模式的关系的.可以理解为“模式的模式”.首先讨论的是job链,把几个模式联合起来解决复杂的,有多个阶段要处理的问题. ...
- Lua基础---迭代器
官方的文档说: 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址 在Lua中迭代器是一种支持指针类型的结构,它可以遍历集合的每 ...
- 怎么样编译DeepMind?
可以通过下面的文章来编译著名的deepmind系统. How to build DeepMind LabDeepMind Lab uses Bazel as its build system. Its ...
- 前端构建工具-fis3使用入门
FIS3 是面向前端的工程构建工具.解决前端工程中性能优化.资源加载(异步.同步.按需.预加载.依赖管理.合并.内嵌).模块化开发.自动化工具.开发规范.代码部署等问题. 官网地址是: https:/ ...
- HDU 3378
http://acm.hdu.edu.cn/showproblem.php?pid=3378 规则去玩三国杀就理解了 纯模拟 注意的点:有已经分出胜负但还在杀的情况出现,所以要每次杀操作前判断是否分出 ...
- Ext JS 5 关于Store load返回json错误信息或异常的处理
关于在store load的时候服务器返回错误信息或服务器出错的处理.ExtJS4应该也能用,没测试过. 这里有两种情况: 服务器返回错误json错误信息,状态为200 服务器异常,状态为500 一. ...
- 【集成学习】sklearn中xgboost模块中plot_importance函数(绘图--特征重要性)
直接上代码,简单 # -*- coding: utf-8 -*- """ ################################################ ...