BZOJ3069: [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。
Sample Input
1 2
1 3
1 4
2 3
3 4
3 7
7 4
5 6
Z 1 4
P 1 3
P 2 4
Z 1 3
P 1 3
Z 6 5
P 5 6
Sample Output
TAK
NIE
NIE
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#define lc ch[x][0]
#define rc ch[x][1]
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=100010;
int n,m,z,ans[maxn],pa[maxn],pa2[maxn];
struct Edge {
int u,v;
bool operator < (const Edge& ths) const {
return u<ths.u||(u==ths.u&&v<ths.v);
}
}E[maxn],Q[maxn];
int findset(int x) {return x==pa[x]?x:pa[x]=findset(pa[x]);}
int findrt(int x) {return x==pa2[x]?x:pa2[x]=findrt(pa2[x]);}
int tp[maxn],del[maxn];
int pre[maxn],fa[maxn],ch[maxn][2],flip[maxn];
void pushdown(int x) {
if(flip[x]) {
flip[lc]^=1;flip[rc]^=1;
swap(lc,rc);flip[x]=0;
}
}
void rotate(int x) {
int y=pre[x],z=pre[y],d=ch[y][0]==x;
ch[y][d^1]=ch[x][d];pre[ch[x][d]]=y;
ch[z][ch[z][1]==y]=x;pre[x]=z;
ch[x][d]=y;pre[y]=x;
}
int S[maxn],top;
void splay(int x) {
for(int i=x;i;i=pre[i]) S[++top]=i;
if(top!=1) fa[x]=fa[S[top]],fa[S[top]]=0;
while(top) pushdown(S[top--]);
while(pre[x]) {
int y=pre[x],z=pre[y];
if(pre[y]) if(ch[y][0]==x^ch[z][0]==y) rotate(x); else rotate(y);
rotate(x);
}
}
void access(int x) {
for(int y=0;x;x=findset(fa[x])) {
splay(x);pre[ch[x][1]]=0;fa[ch[x][1]]=x;
ch[x][1]=y;pre[y]=x;y=x;
}
}
void makeroot(int x) {access(x);splay(x);flip[x]^=1;}
void link(int x,int y) {makeroot(x);fa[x]=y;}
void dfs(int x,int y) {
if(!x) return;pushdown(x);
pa[findset(x)]=findset(y);
dfs(ch[x][0],y);dfs(ch[x][1],y);
ch[x][0]=ch[x][1]=0;
}
void cycle(int x,int y) {
makeroot(x);access(y);splay(y);dfs(y,y);
}
void Add(int x,int y) {
x=findset(x);y=findset(y);if(x==y) return;
if(findrt(x)!=findrt(y)) link(x,y),pa2[findrt(x)]=findrt(y);
else cycle(x,y);
}
int main() {
n=read();m=read();z=read();
rep(i,1,m) {
E[i].u=read(),E[i].v=read();
if(E[i].u>E[i].v) swap(E[i].u,E[i].v);
}
sort(E+1,E+m+1);
rep(i,1,z) {
char c=Getchar();while(!isalpha(c)) c=Getchar();
tp[i]=(c=='P');Q[i].u=read();Q[i].v=read();if(Q[i].u>Q[i].v) swap(Q[i].u,Q[i].v);
if(!tp[i]) {
int l=1,r=m,mid;
while(l<r) if(E[mid=l+r>>1]<Q[i]) l=mid+1; else r=mid;
del[l]=1;
}
}
rep(i,1,n) pa[i]=pa2[i]=i;
rep(i,1,m) if(!del[i]) Add(E[i].u,E[i].v);
dwn(i,z,1) {
if(!tp[i]) Add(Q[i].u,Q[i].v);
else ans[i]=findset(Q[i].u)==findset(Q[i].v);
}
rep(i,1,z) if(tp[i]) puts(ans[i]?"TAK":"NIE");
return 0;
}
BZOJ3069: [Pa2011]Hard Choice 艰难的选择的更多相关文章
- 3069: [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 ...
随机推荐
- 三、Shell变量类型和运算符
一.Shell变量的应用 1.Shell变量的种类 ·用户自定义变量:由用户自己定义.修改和使用 ·预定义变量:Bash预定义的特殊变量,不能直接修改 ·位置变量:通过命令行给 ...
- 深入理解javascript原型和闭包(7)——原型的灵活性
在Java和C#中,你可以简单的理解class是一个模子,对象就是被这个模子压出来的一批一批月饼(中秋节刚过完).压个啥样,就得是个啥样,不能随便动,动一动就坏了. 而在javascript中,就没有 ...
- JSP与EL隐式对象
一,JSP隐式对象 隐式对象是可以直接使用的,无需声明.因为在JSP转译为servlet文件后,会自动声明其对象. 隐式对象① 说明 out 对应JspWriter对象,其内部关联一个PrintWri ...
- sqlserver实现数据库读写分离介绍
对于负载均衡,笔者经常接触的当属Oracle的负载均衡机制.下面我们重点介绍Sql Server 2005是如何实现负载均衡的,感兴趣的朋友可以参考下哈 Internet的规模每一百天就会增长一倍,客 ...
- https://zeroc.com/index.html
https://zeroc.com/index.html http://blog.shutupandcode.net/?p=1085
- 【分享】SQL中的注入漏洞
例:假设一个账户密码的输入在数据库中是这样进行判断的. ' ) AS PWDCORRECT FROM T_USER WHERE FUSER= 'GUEST' 如果输入: ') AS PWDCORREC ...
- React-native 学习记录
在此记录下学习中的小知识 今天在componentWillUpdate调用this.setState方法,想达到一个效果:就像viewWillAppear时,系统从网络请求新的数据,并刷新界面, 但是 ...
- 校园网搭建HUSTOJ记录
上学期和网管中心的老师说过很多次--要在校园网上搭OJ,当时那边老师说要等"虚拟化搞好了以后才能搭".直到上周,终于在校园网上申请到了一个虚拟主机,4核,10G内存,100G硬盘, ...
- vim 使用
vim有三种模式:输入模式,命令模式,底行模式,使用esc进入命令模式,在命令模式下按英文的冒号,进入底行模式:命令行模式下按i进入输入模式.vim编辑文件是将文件内容复制到缓冲区显示在屏幕上. vi ...
- Quartz资源收藏
项目中使用Quartz集群分享 : http://hot66hot.iteye.com/blog/1726143 发布 Quartz Job Scheduling Framework 中文 PDF 版 ...