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

7 8 7
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
TAK
NIE
NIE
 
做过BZOJ2959长跑的话这道题就很简单了,先时光倒流把删边转化成加边,然后用LCT来维护边-双联通分量并缩环,具体见code。
我第一次单旋LCT被卡掉!!!外国人太强了!!!看来以后写LCT不能偷懒了。
  1. #include<cstdio>
  2. #include<cctype>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define lc ch[x][0]
  6. #define rc ch[x][1]
  7. #define rep(i,s,t) for(int i=s;i<=t;i++)
  8. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  9. #define ren for(int i=first[x];i;i=next[i])
  10. using namespace std;
  11. const int BufferSize=1<<16;
  12. char buffer[BufferSize],*head,*tail;
  13. inline char Getchar() {
  14. if(head==tail) {
  15. int l=fread(buffer,1,BufferSize,stdin);
  16. tail=(head=buffer)+l;
  17. }
  18. return *head++;
  19. }
  20. inline int read() {
  21. int x=0,f=1;char c=Getchar();
  22. for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
  23. for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
  24. return x*f;
  25. }
  26. const int maxn=100010;
  27. int n,m,z,ans[maxn],pa[maxn],pa2[maxn];
  28. struct Edge {
  29. int u,v;
  30. bool operator < (const Edge& ths) const {
  31. return u<ths.u||(u==ths.u&&v<ths.v);
  32. }
  33. }E[maxn],Q[maxn];
  34. int findset(int x) {return x==pa[x]?x:pa[x]=findset(pa[x]);}
  35. int findrt(int x) {return x==pa2[x]?x:pa2[x]=findrt(pa2[x]);}
  36. int tp[maxn],del[maxn];
  37. int pre[maxn],fa[maxn],ch[maxn][2],flip[maxn];
  38. void pushdown(int x) {
  39. if(flip[x]) {
  40. flip[lc]^=1;flip[rc]^=1;
  41. swap(lc,rc);flip[x]=0;
  42. }
  43. }
  44. void rotate(int x) {
  45. int y=pre[x],z=pre[y],d=ch[y][0]==x;
  46. ch[y][d^1]=ch[x][d];pre[ch[x][d]]=y;
  47. ch[z][ch[z][1]==y]=x;pre[x]=z;
  48. ch[x][d]=y;pre[y]=x;
  49. }
  50. int S[maxn],top;
  51. void splay(int x) {
  52. for(int i=x;i;i=pre[i]) S[++top]=i;
  53. if(top!=1) fa[x]=fa[S[top]],fa[S[top]]=0;
  54. while(top) pushdown(S[top--]);
  55. while(pre[x]) {
  56. int y=pre[x],z=pre[y];
  57. if(pre[y]) if(ch[y][0]==x^ch[z][0]==y) rotate(x); else rotate(y);
  58. rotate(x);
  59. }
  60. }
  61. void access(int x) {
  62. for(int y=0;x;x=findset(fa[x])) {
  63. splay(x);pre[ch[x][1]]=0;fa[ch[x][1]]=x;
  64. ch[x][1]=y;pre[y]=x;y=x;
  65. }
  66. }
  67. void makeroot(int x) {access(x);splay(x);flip[x]^=1;}
  68. void link(int x,int y) {makeroot(x);fa[x]=y;}
  69. void dfs(int x,int y) {
  70. if(!x) return;pushdown(x);
  71. pa[findset(x)]=findset(y);
  72. dfs(ch[x][0],y);dfs(ch[x][1],y);
  73. ch[x][0]=ch[x][1]=0;
  74. }
  75. void cycle(int x,int y) {
  76. makeroot(x);access(y);splay(y);dfs(y,y);
  77. }
  78. void Add(int x,int y) {
  79. x=findset(x);y=findset(y);if(x==y) return;
  80. if(findrt(x)!=findrt(y)) link(x,y),pa2[findrt(x)]=findrt(y);
  81. else cycle(x,y);
  82. }
  83. int main() {
  84. n=read();m=read();z=read();
  85. rep(i,1,m) {
  86. E[i].u=read(),E[i].v=read();
  87. if(E[i].u>E[i].v) swap(E[i].u,E[i].v);
  88. }
  89. sort(E+1,E+m+1);
  90. rep(i,1,z) {
  91. char c=Getchar();while(!isalpha(c)) c=Getchar();
  92. 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);
  93. if(!tp[i]) {
  94. int l=1,r=m,mid;
  95. while(l<r) if(E[mid=l+r>>1]<Q[i]) l=mid+1; else r=mid;
  96. del[l]=1;
  97. }
  98. }
  99. rep(i,1,n) pa[i]=pa2[i]=i;
  100. rep(i,1,m) if(!del[i]) Add(E[i].u,E[i].v);
  101. dwn(i,z,1) {
  102. if(!tp[i]) Add(Q[i].u,Q[i].v);
  103. else ans[i]=findset(Q[i].u)==findset(Q[i].v);
  104. }
  105. rep(i,1,z) if(tp[i]) puts(ans[i]?"TAK":"NIE");
  106. return 0;
  107. }

  

BZOJ3069: [Pa2011]Hard Choice 艰难的选择的更多相关文章

  1. 3069: [Pa2011]Hard Choice 艰难的选择

    Description Byteasar是一个很纠结的人.每次他经过Bytetown的时候都知道有至少2条不同的路径可以选择,这导致他必须花很长时间来决定走哪条路.Byteasar最近听说了Bytet ...

  2. UVA 1175 Ladies' Choice 女士的选择(稳定婚姻问题,GS算法)

    题意: 给出每个男的心目中的女神排序,给出每个女的心目中的男神排序,即两个n*n的矩阵,一旦任意两个非舞伴的男女同学觉得对方都比现任舞伴要好,他们就会抛弃舞伴而在一起.为了杜绝这种现象,求每个男的最后 ...

  3. 题解 洛谷 P6351 【[PA2011]Hard Choice】

    删边操作不好处理,所以先将操作倒序,将删边转化为加边. 考虑对于两个点的询问,若这两点不连通或这两个点分别处于两个不同的边双连通分量中(两点间存在桥)时,是不满足题目要求的. 可以用\(LCT\)来维 ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. 6个原因说服你选择PostgreSQL9.6

    PostgreSQL9.6在前些日子发布了, 社区为该版本的重大更新付诸良多, 发布日志一如既往的长,我挑选了6个重要的更新, 这些或许能够帮助你更好的使用PostgreSQL. 并行: 并行应该是这 ...

  6. 选择——ERP信息系统选型

    做一次选择并不难,难的是做一次坚定而正确的选择.TCL电脑公司的ERP软件选型就是一次正确而艰难的选择过程.让我们从头说起吧!­ 业界都知道TCL电脑是IT行业的新入行者,更知道TCL的另一个诠释:& ...

  7. python random从集合中随机选择元素

    1.使用python random模块的choice方法随机选择某个元素 from random import choice foo = ['a', 'b', 'c', 'd', 'e'] print ...

  8. Python switch(多分支选择)的实现

    Python 中没有 switch/case 语法,如果使用 if/elif/else 会出现代码过长.不清晰等问题. 而借助字典就可以实现 switch 的功能 示例: def case1(): # ...

  9. Django框架(十一)-- 补充:inclusion_tag、defer、only、choice、事务、创建多对多的第三张表、mvc和mtv模式

    一.inclusion_tag 1.作用 用于生成HTML片段,是数据由参数传入而变成动态 2.使用 # 1.app下新建一个模块,templatetags # 2.创建一个py文件(mytag.py ...

随机推荐

  1. ASP.NET WEB API路由机制

    (一)路由原理 (二)路由设计架构分析 RouteBase

  2. 如何自定义iphone个性铃音

    准备工作:itunes.(Netease Cloud Music).iphone 1.下载你想要的铃音原音乐: 2.打开itunes,向音乐库中添加刚刚下载的音乐: "文件"-&g ...

  3. JSP入门

    JSP简介 所谓JSP就是在网页文件中嵌入Java代码或JSP定义的一些标记.JSP是建立在Servlet上的,在执行时JSP容器会先将JSP文件转换成Servlet文件以及class 文件,然后再执 ...

  4. PHP如何判断一个数组是一维数组或者是二维数组?用什么函数?

    如题:如何判断一个数组是一维数组或者是二维数组?用什么函数? 判断数量即可 <?php if (count($array) == count($array, 1)) { echo '是一维数组' ...

  5. class Solution(object): def fizzBuzz(self, n): a = [] i = 1 while(i <= n): if(i%15 == 0): a.append("FizzBuzz") elifleetcode day_01

    412. Fizz Buzz Write a program that outputs the string representation of numbers from 1 to n. But fo ...

  6. Asp.Net Core--授权介绍

    翻译如下: 授权指的是确定一个用户能够做什么的过程.例如用户可以Adam能够创建一个文档库,添加文档,编辑文档并将其删除.用户Bob可能只被授权在单个库中读取文件. 授权与验证,这是查明谁一个用户的过 ...

  7. iOS开发——高级篇——iPad开发、iPad开发中的modal

    一.iPad简介 1.什么是iPad一款苹果公司于2010年发布的平板电脑定位介于苹果的智能手机iPhone和笔记本电脑产品之间跟iPhone一样,搭载的是iOS操作系统 2.iPhone和iPadi ...

  8. Deep Learning入门视频(下)之关于《感受神经网络》两节中的代码解释

    代码1如下: #深度学习入门课程之感受神经网络(上)代码解释: import numpy as np import matplotlib.pyplot as plt #matplotlib是一个库,p ...

  9. ng-bind 与ng-model区别

    双向绑定,一般来说是这样 <input ng-model="object.xxx"> <span ng-bind="object.xxx"&g ...

  10. SQL入门语句之LIKE、GLOB和LIMIT

    一.SQL入门语句之LIKE LIKE用来匹配通配符指定模式的文本值.如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1.这里有两个通配符与 LIKE 运算符一起使用,百 ...