题目

由于始终保证连通性于是我们可以用\(LCT\)来维护这个森林

三个操作分别是\(link,cut,findroot\)

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #define maxn 10005
  4. #define re register
  5. inline int read()
  6. {
  7. char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
  8. while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
  9. }
  10. char opt[15];
  11. int n,m;
  12. int rev[maxn],fa[maxn],ch[maxn][2],st[maxn];
  13. inline int nroot(int x) {return ch[fa[x]][0]==x||ch[fa[x]][1]==x;}
  14. inline void pushdown(int x) {
  15. if(!rev[x]) return;
  16. rev[x]=0,rev[ch[x][0]]^=1,rev[ch[x][1]]^=1;
  17. std::swap(ch[ch[x][0]][0],ch[ch[x][0]][1]);
  18. std::swap(ch[ch[x][1]][0],ch[ch[x][1]][1]);
  19. }
  20. inline void rotate(int x) {
  21. int y=fa[x],z=fa[y],k=ch[y][1]==x,w=ch[x][k^1];
  22. if(nroot(y)) ch[z][ch[z][1]==y]=x;
  23. ch[x][k^1]=y,ch[y][k]=w;
  24. fa[w]=y;fa[y]=x,fa[x]=z;
  25. }
  26. inline void splay(int x) {
  27. int y=x,top=0;
  28. st[++top]=x;
  29. while(nroot(y)) st[++top]=fa[y],y=fa[y];
  30. while(top) pushdown(st[top--]);
  31. while(nroot(x)) {
  32. int y=fa[x];
  33. if(nroot(y)) rotate((ch[fa[y]][1]==y)^(ch[y][1]==x)?x:y);
  34. rotate(x);
  35. }
  36. }
  37. inline void access(int x) {
  38. for(re int y=0;x;y=x,x=fa[x])
  39. splay(x),ch[x][1]=y;
  40. }
  41. inline void makeroot(int x) {
  42. access(x);splay(x);rev[x]^=1;std::swap(ch[x][0],ch[x][1]);
  43. }
  44. inline int findroot(int x) {
  45. access(x),splay(x);
  46. while(ch[x][0]) pushdown(x),x=ch[x][0];
  47. return x;
  48. }
  49. inline void link(int x,int y) {
  50. makeroot(x);
  51. if(findroot(y)!=x) fa[x]=y;
  52. }
  53. inline void split(int x,int y) {
  54. makeroot(x);access(y);splay(y);
  55. }
  56. inline void cut(int x,int y) {
  57. split(x,y);fa[x]=ch[y][0]=0;
  58. }
  59. int main()
  60. {
  61. n=read(),m=read();
  62. int x,y;
  63. while(m--) {
  64. scanf("%s",opt);x=read(),y=read();
  65. if(opt[0]=='D') cut(x,y);
  66. if(opt[0]=='C') link(x,y);
  67. if(opt[0]=='Q') puts((findroot(x)==findroot(y))?"Yes":"No");
  68. }
  69. return 0;
  70. }

【[SDOI2008]洞穴勘测】的更多相关文章

  1. P2147 [SDOI2008]洞穴勘测(LCT)

    P2147 [SDOI2008]洞穴勘测 裸的LCT. #include<iostream> #include<cstdio> #include<cstring> ...

  2. P2147 [SDOI2008]洞穴勘测

    P2147 [SDOI2008]洞穴勘测 思路 没办法,我就是喜欢板子都想发的人 都是基础操作,不多说了 代码 #include <bits/stdc++.h> #define ls ch ...

  3. BZOJ2049[Sdoi2008]洞穴勘测——LCT

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

  4. 洛谷P2147[SDOI2008]洞穴勘测(lct)

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

  5. [BZOJ2049] [SDOI2008] 洞穴勘测

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

  6. BZOJ2049:[SDOI2008]洞穴勘测——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2049 https://www.luogu.org/problemnew/show/P2147 辉辉热 ...

  7. LG3690 【模板】Link Cut Tree 和 SDOI2008 洞穴勘测

    UPD:更新了写法. [模板]Link Cut Tree 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 后接两个整数(x,y),代表询问从x到y ...

  8. [洛谷P2147][SDOI2008]洞穴勘测

    题目大意:有$n$个洞穴,$m$条指令,指令有三种 $Connect\;u\;v$:在$u,v$之间连一条边 $Destroy\;u\;v$:切断$u,v$之间的边 $Query\;u\;v$:询问$ ...

  9. 【题解】Luogu P2147 [SDOI2008]洞穴勘测

    原题传送门 这题用Link-Cut-Tree解决,Link-Cut-Tree详解 我不太会踩爆Link-Cut-Tree的并查集做法qaq 我们用Link-Cut-Tree维护连通性(十分无脑) Co ...

  10. [SDOI2008]洞穴勘测

    嘟嘟嘟 写完lct的板儿后觉得这就是一道大水题. 连pushup都不用. 不过还是因为一个zz的错误debug了一小会儿(Link的时候连出自环--) 还有一件事就是Cut的时候判断条件还得加上,因为 ...

随机推荐

  1. Open Closed Principle(OCP)开闭原则

    面向对象的最基本原则 Software entites like classes,modules and functions should be open for extension but cloa ...

  2. mysql 数据库8.0版本,jdbc驱动连接问题

    前言 8.0版本的mysql数据的连接 与 5.0的有所不同,下面直接贴出  8.0版本应该有的 jdbc驱动连接,还有 mysql 的jdbc jar包要8.0以上的 内容如下 : jdbc.dri ...

  3. angular 兼容IE浏览器

    安装classlist.babel-polyfill: npm install --save classlist.js npm install --save babel-polyfill 修改 src ...

  4. Windows加密技术概述

    Windows加密是安全体系的重要基础和组成部分.现代CPU的保护模式是系统安全的硬件基石,基于CPU硬件的特权分级,Windows让自身的关键系统代码运行在高处理器特权级的内核模式,各种应用程序则运 ...

  5. JS常用的设计模式(5)——代理模式

    代理模式的定义是把对一个对象的访问, 交给另一个代理对象来操作. 举一个例子, 我在追一个MM想给她送一束花,但是我因为我性格比较腼腆,所以我托付了MM的一个好朋友来送. 这个例子不是非常好, 至少我 ...

  6. 网站部署中遇到的问题-编译器错误信息: CS0016

    问题描述: 访问站点出现错误win7 x64+iis7.5 配置错误:CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\ ...

  7. hdu 1087 最大递增和

    思路和LIS差不多,dp[i]为i结尾最大值 #include <iostream> #include <string> #include <cstring> #i ...

  8. 1729 单词查找树 2000年NOI全国竞赛

    1729 单词查找树 2000年NOI全国竞赛 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master         题目描述 Description 在进行文法分析的 ...

  9. ASP.NET 中对大文件上传的简单处理

    在 ASP.NET 开发的过程中,文件上传往往使用自带的 FileUpload 控件,可是用过的人都知道,这个控件的局限性十分大,最大的问题就在于上传大文件时让开发者尤为的头疼,而且,上传时无法方便的 ...

  10. Linux c获取时间

    linux c获得时间和设置时间 #include<time.h> //C语言的头文件 #include<stdio.h> //C语言的I/O void main() { ti ...