原题

这是一道LCT的板子题。

至于LCT——link cut tree,也叫动态树,用splay实现动态连边的树。

预备知识:

实边:一个非叶节点,向它的儿子中的一个连一条特殊的边,称为实边;该非叶节点向它的其他儿子所引的边均为虚边。注意,对于某些非叶节点,它与它儿子们所连的边可能全部是虚边

LCT的操作:

access(x) ——将x到根的路径变成实路径(该实路径的端点为根和x)

makeroot(x) ——将x变为所在树的根节点

findroot(x) ——查找x所在树的根节点

link(x,y) ——连接x与y

cut(x,y) ——切断x与y的边

这道题询问连通性,所以只要findroot是否一样即可

AC代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define N 100010
  4. #define which(u) (ls[fa[(u)]]==(u))
  5. #define isroot(u) (!fa[(u)] || (ls[fa[(u)]]!=(u) && rs[fa[u]]!=(u)))
  6. using namespace std;
  7. int n,m,fa[N],ls[N],rs[N];
  8. bool rev[N];
  9. char s[20];
  10. void rotate(int u)
  11. {
  12. int v=fa[u],w=fa[v],b=which(u)?rs[u]:ls[u];
  13. if (!isroot(v)) (which(v)?ls[w]:rs[w])=u;
  14. which(u)?(ls[v]=b,rs[u]=v):(rs[v]=b,ls[u]=v);
  15. fa[u]=w,fa[v]=u;
  16. if (b) fa[b]=v;
  17. }
  18. void pushdown(int u)
  19. {
  20. if (!rev[u]) return ;
  21. rev[ls[u]]^=1;
  22. rev[rs[u]]^=1;
  23. swap(ls[u],rs[u]);
  24. rev[u]=0;
  25. }
  26. void splay(int u)
  27. {
  28. static int stk[N],top;
  29. stk[top=1]=u;
  30. while (!isroot(stk[top])) stk[top+1]=fa[stk[top]],top++;
  31. while (top) pushdown(stk[top--]);
  32. while (!isroot(u))
  33. {
  34. if (!isroot(fa[u]))
  35. {
  36. if (which(u)==which(fa[u])) rotate(fa[u]);
  37. else rotate(u);
  38. }
  39. rotate(u);
  40. }
  41. }
  42. void access(int u)
  43. {
  44. int v=0;
  45. while (u)
  46. {
  47. splay(u);
  48. rs[u]=v;
  49. v=u;
  50. u=fa[u];
  51. }
  52. }
  53. void makeroot(int u)
  54. {
  55. access(u);
  56. splay(u);
  57. rev[u]^=1;
  58. }
  59. int findroot(int u)
  60. {
  61. access(u);
  62. splay(u);
  63. while (pushdown(u),ls[u]) u=ls[u];
  64. splay(u);
  65. return u;
  66. }
  67. void link(int u,int v)
  68. {
  69. makeroot(v);
  70. fa[v]=u;
  71. }
  72. void cut(int u,int v)
  73. {
  74. makeroot(u);
  75. access(v);
  76. splay(v);
  77. ls[v]=fa[u]=0;
  78. }
  79. int main()
  80. {
  81. scanf("%d%d",&n,&m);
  82. while (m--)
  83. {
  84. int u,v;
  85. scanf("%s",s+1);
  86. scanf("%d%d",&u,&v);
  87. if (s[1]=='C') link(u,v);
  88. else if (s[1]=='Q') findroot(u)==findroot(v)?puts("Yes"):puts("No");
  89. else cut(u,v);
  90. }
  91. return 0;
  92. }

[bzoj] 2049 洞穴勘探 || LCT的更多相关文章

  1. 洛谷P2147 [SDOI2008] 洞穴勘探 [LCT]

    题目传送门 洞穴勘探 题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道 ...

  2. BZOJ 2049 洞穴勘测

    LCT判断联通性 没什么特别的..还是一个普通的板子题,把LCT当并查集用了,只不过LCT灵活一些,还可以断边 话说自从昨天被维修数列那题榨干之后我现在写splay都不用动脑子了,,机械式的码spla ...

  3. BZOJ 2049洞穴探测

    辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如两个洞穴可 ...

  4. [BZOJ 2049] [Sdoi2008] Cave 洞穴勘测 【LCT】

    题目链接:BZOJ - 2049 题目分析 LCT的基本模型,包括 Link ,Cut 操作和判断两个点是否在同一棵树内. Link(x, y) : Make_Root(x); Splay(x); F ...

  5. ●BZOJ 2049 [Sdoi2008]Cave洞穴勘测

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2049 题解: LCT入门题 就是判两个点是否在同一颗树里 代码: #include<c ...

  6. [SDOI2008] 洞穴勘测 (LCT模板)

    bzoj 2049 传送门 洛谷P2147 传送门 这个大佬的LCT详解超级棒的! Link-Cut Tree的基本思路是用splay的森林维护一条条树链. splay的森林,顾名思义,就是若干spl ...

  7. [BZOJ - 2631] tree 【LCT】

    题目链接:BZOJ - 2631 题目分析 LCT,像线段树区间乘,区间加那样打标记. 这道题我调了一下午. 提交之后TLE了,我一直以为是写错了导致了死循环. 于是一直在排查错误.直到.. 直到我看 ...

  8. BZOJ 2049: [Sdoi2008]Cave 洞穴勘測 LCT

    入门级LCT: 仅仅有 Cut Link 2049: [Sdoi2008]Cave 洞穴勘測 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 3073 ...

  9. bzoj 2049: [Sdoi2008]Cave 洞穴勘测 (LCT)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2049 题面: 2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 1 ...

随机推荐

  1. centos7下安装mysql8.0.12及设置权限

    一.mysql版本介绍 mysql的官网为:https://www.mysql.com/ 在官网上可以看到多个版本,主要版本如下, 1.MySQL Community Server 社区版本,开源免费 ...

  2. hdu1848Fibonacci again and again(sg函数)

    Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  3. 汽车VIN码,车架号,移动端,服务器端OCR识别 技术公司

    很多人在购买车辆的时候,只关注性能.外观.内饰等,其实真正的内行是首先看车辆的VIN码,也叫车架号码. VIN码(车架号码)是一辆车的唯一身份证明,一般在车辆的挡风玻璃处,有的在车辆防火墙上,或B柱铭 ...

  4. XSS--编码绕过,qcms,鲶鱼cms

    一.编码绕过 1)HTML进制编码 标签中的某些属性值可以使用html十进制.十六进制表示 2)JavaScript编码 JavaScript支持unicode.八进制.十六进制.十进制等 3)URL ...

  5. Java开发工程师(Web方向) - 01.Java Web开发入门 - 第5章.Git

    第5章--Git 版本控制简介 VCS (version control system) 版本控制系统:记录若干文件的修订记录的系统,帮助查阅/回到某个历史版本 LVCS本地 CVCS集中式(Cent ...

  6. Java应用基础微专业-工程篇

    第1章-命令行 1.1 命令行基础 ls -a: list all files (including hidden files) .DS_Store: files detailed informati ...

  7. 【system.number】使用说明

    对象:system.number 说明:提供一系列针对数值类型的操作 目录: 方法 返回 说明 system.number.isNumber( number ) [True | False] 检测是否 ...

  8. 天平 (Not so Mobile UVA - 839)

    题目描述: 题目思路: 1.DFS建树 2.只有每个树的左右子树都平衡整颗树才平衡 #include <iostream> using namespace std; bool solve( ...

  9. 技能get,React的优雅升级!

    今日,我们不啖鸡汤,不饮鸡血 只有干货——关于React的优雅升级 双手奉上,来,干了! -2019年第4期- 夫 子 说 本次升级基础包情况:react 15.6 -> 16.6 升级流程: ...

  10. An Adaptive Color-Based Particle Filter--粒子滤波

    粒子滤波跟踪的具体步骤如下: 1. Resampling the particles to avoid degeneracy 2. Propagate  each particles accordin ...