题目传送门

部落冲突

格式难调,体面就不放了。


  分析:

  julao们应该都看得出来就是个$LCT$板子,战争就$cut$,结束就$link$,询问就$find$。没了。。。

  太久没打$LCT$,然后发现自己之前貌似理解得并不透彻,打得还是不熟。。。

  Code:

  1. //It is made by HolseLee on 5th Sep 2018
  2. //Luogu.org P3950
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<cmath>
  7. #include<iostream>
  8. #include<iomanip>
  9. #include<algorithm>
  10. using namespace std;
  11.  
  12. const int N=3e5+;
  13. int n,m,fa[N],ch[N][],sign[N],cnt,q[N],top;
  14. struct War{
  15. int x,y; bool flag;
  16. }a[N];
  17.  
  18. inline int read()
  19. {
  20. char c=getchar(); int num=; bool flag=false;
  21. while( c<'' || c>'' ) {
  22. if( c=='-' ) flag=false;
  23. c=getchar();
  24. }
  25. while( c>='' && c<='' ) {
  26. num=(num<<)+(num<<)+(c^);
  27. c=getchar();
  28. }
  29. return flag ? -num : num;
  30. }
  31.  
  32. inline void pushdown(int x)
  33. {
  34. if( !sign[x] ) return;
  35. int temp=ch[x][];
  36. sign[ch[x][]=ch[x][]]^=;
  37. sign[ch[x][]=temp]^=;
  38. sign[x]=;
  39. }
  40.  
  41. inline bool isroot(int x)
  42. {
  43. return (ch[fa[x]][]!=x && ch[fa[x]][]!=x);
  44. }
  45.  
  46. inline void rotate(int x)
  47. {
  48. int y=fa[x], z=fa[y];
  49. int k=ch[y][]==x, w=ch[x][k^];
  50. if( !isroot(y) ) ch[z][ch[z][]==y]=x;
  51. ch[x][k^]=y; ch[y][k]=w;
  52. if( w ) fa[w]=y; fa[x]=z; fa[y]=x;
  53. }
  54.  
  55. inline void splay(int x)
  56. {
  57. top=; q[top]=x;
  58. for(int i=x; !isroot(i); i=fa[i])
  59. q[++top]=fa[i];
  60. while( top ) pushdown(q[top--]);
  61. while( !isroot(x) ) {
  62. int y=fa[x], z=fa[y];
  63. if( !isroot(y) ) {
  64. (ch[y][]==x)^(ch[z][]==y) ? rotate(x) : rotate(y);
  65. }
  66. rotate(x);
  67. }
  68. }
  69.  
  70. inline void access(int x)
  71. {
  72. for(int y=; x; y=x,x=fa[x]) {
  73. splay(x); ch[x][]=y;
  74. }
  75. }
  76.  
  77. inline int find(int x)
  78. {
  79. access(x); splay(x);
  80. while( ch[x][] )pushdown(x),x=ch[x][];
  81. splay(x);
  82. return x;
  83. }
  84.  
  85. inline void makeroot(int x)
  86. {
  87. access(x); splay(x); sign[x]^=;
  88. }
  89.  
  90. inline void split(int x,int y)
  91. {
  92. makeroot(x); access(y); splay(y);
  93. }
  94.  
  95. inline void link(int x,int y)
  96. {
  97. makeroot(x);
  98. fa[x]=y;
  99. }
  100.  
  101. inline void cut(int x,int y)
  102. {
  103. split(x,y);
  104. fa[x]=ch[y][]=;
  105. }
  106.  
  107. int main()
  108. {
  109. n=read(); m=read();
  110. char opt[]; int x,y;
  111. for(int i=; i<n; ++i) {
  112. x=read(), y=read();
  113. link(x,y);
  114. }
  115. for(int i=; i<=m; ++i) {
  116. scanf("%s",opt);
  117. if( opt[]=='Q' ) {
  118. x=read(), y=read();
  119. if( find(y)==find(x) ) printf("Yes\n");
  120. else printf("No\n");
  121. } else if( opt[]=='C' ) {
  122. x=read(), y=read();
  123. cut(x,y);
  124. a[++cnt].x=x, a[cnt].y=y;
  125. a[cnt].flag=false;
  126. } else {
  127. x=read();
  128. if( a[x].flag ) continue;
  129. link(a[x].x,a[x].y);
  130. a[x].flag=true;
  131. }
  132. }
  133. return ;
  134. }

洛谷P3950 部落冲突 [LCT]的更多相关文章

  1. 洛谷 P3950 部落冲突 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例1 输出样例1 输入样例2 输出样例2 输入样例3 输出样例3 说明 思路 AC代码 总结 题面 题目链接 P3 ...

  2. 洛谷P3950 部落冲突(LCT)

    洛谷题目传送门 最无脑LCT题解,Dalao们的各种算法都比这个好多啦... 唯一的好处就是只管码代码就好了 开战cut,停战link,询问findroot判连通性 太无脑,应该不用打注释了.常数大就 ...

  3. 【刷题】洛谷 P3950 部落冲突

    题目背景 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多 ...

  4. 洛谷:P3950 部落冲突

    原题地址:https://www.luogu.org/problemnew/show/P3950 题目简述 给定一棵树,每次给定一个操作,有如下两种: 将某条边染黑 2.询问给定的u,v两点间是否有边 ...

  5. [题解] 洛谷P3950 部落冲突

    传送门 拿到题目,一看 裸LCT (其实是我懒得打,splay又臭又长) 首先,这道题的意思就是删掉一些边 所以常规操作 点权转边权 之后对于战争操作,在对应的边上+1 对于和平操作,在对应的边上-1 ...

  6. [洛谷P3950]部落冲突

    题目大意:给你一棵树,有$3$个操作: $Q\;p\;q:$询问$p,q$是否连通 $C\;p\;q:$把$p->q$这条边割断 $U\;x:$恢复第$x$次操作二 题解:可以在割断时把这条边赋 ...

  7. Cogs 2856. [洛谷U14475]部落冲突

    2856. [洛谷U14475]部落冲突 ★★★   输入文件:lct.in   输出文件:lct.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 在一个叫做Travi ...

  8. 洛谷 U14475 部落冲突 【比赛】 【树链剖分 + 线段树】

    题目背景 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多 ...

  9. lupgu P3950 部落冲突

    题目链接 luogu P3950 部落冲突 题解 树剖线段树可以 lct还行 代码 #include<cstdio> #include<algorithm> inline in ...

随机推荐

  1. gcc和MinGW的异同

    cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从 ...

  2. selenium利用Excel进行参数化(简单示例)

    上篇搭建好环境后,正真开始我的自动化之旅了.... 开始之前特别说明一下testNG的版本,不能直接使用Eclipse直接线上下载的版本,线上版本太高,不能兼容,运行程序会报以下错误,需要自行下载低一 ...

  3. DES加密解密类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.S ...

  4. [USACO07FEB] Lilypad Pond

    https://www.luogu.org/problem/show?pid=1606 题目描述 FJ has installed a beautiful pond for his cows' aes ...

  5. 重构改善既有代码设计--重构手法16:Introduce Foreign Method (引入外加函数)&& 重构手法17:Introduce Local Extension (引入本地扩展)

    重构手法16:Introduce Foreign Method (引入外加函数)你需要为提供服务的类增加一个函数,但你无法修改这个类.在客户类中建立一个函数,并以第一参数形式传入一个服务类实例. 动机 ...

  6. 【BZOJ】1901: Zju2112 Dynamic Rankings

    [题意]带修改的查询区间第k小 [算法]树状数组套可持久化线段树 [题解]对于树状数组上的每个节点,维护可持久化权值线段树(节点为权值),从而达到查询前缀和的目的. 对于每次修改,在待修改线段树基础上 ...

  7. 面向对象 ( OO ) 的程序设计——理解对象

    本文地址:http://www.cnblogs.com/veinyin/p/7607938.html  1 创建自定义对象 创建自定义对象的最简单方法为创建 Object 的实例,并添加属性方法,也可 ...

  8. Use of exceptionless, 作全局日志分布式记录处理

    Download latest release of exceptionless on github and deploy on Window server, by default exception ...

  9. 51Nod 1256 扩展欧几里得求乘法逆元

    给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的. Input 输入2个数M, N中间用 ...

  10. 2017ACM暑期多校联合训练 - Team 5 1006 HDU 5205 Rikka with Graph (找规律)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...