Description

辉辉热衷于洞穴勘测。某天,他按照地图来到了一片被标记为JSZX的洞穴群地区。经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴。假如两个洞穴可以通过一条或者多条通道按一定顺序连接起来,那么这两个洞穴就是连通的,按顺序连接在一起的这些通道则被称之为这两个洞穴之间的一条路径。洞穴都十分坚固无法破坏,然而通道不太稳定,时常因为外界影响而发生改变,比如,根据有关仪器的监测结果,123号洞穴和127号洞穴之间有时会出现一条通道,有时这条通道又会因为某种稀奇古怪的原因被毁。辉辉有一台监测仪器可以实时将通道的每一次改变状况在辉辉手边的终端机上显示:如果监测到洞穴u和洞穴v之间出现了一条通道,终端机上会显示一条指令 Connect u v 如果监测到洞穴u和洞穴v之间的通道被毁,终端机上会显示一条指令 Destroy u v 经过长期的艰苦卓绝的手工推算,辉辉发现一个奇怪的现象:无论通道怎么改变,任意时刻任意两个洞穴之间至多只有一条路径。因而,辉辉坚信这是由于某种本质规律的支配导致的。因而,辉辉更加夜以继日地坚守在终端机之前,试图通过通道的改变情况来研究这条本质规律。然而,终于有一天,辉辉在堆积成山的演算纸中崩溃了……他把终端机往地面一砸(终端机也足够坚固无法破坏),转而求助于你,说道:“你老兄把这程序写写吧”。辉辉希望能随时通过终端机发出指令 Query u v,向监测仪询问此时洞穴u和洞穴v是否连通。现在你要为他编写程序回答每一次询问。已知在第一条指令显示之前,JSZX洞穴群中没有任何通道存在。

Input

第一行为两个正整数n和m,分别表示洞穴的个数和终端机上出现过的指令的个数。以下m行,依次表示终端机上出现的各条指令。每行开头是一个表示指令种类的字符串s(”Connect”、”Destroy”或者”Query”,区分大小写),之后有两个整数u和v (1≤u, v≤n且u≠v) 分别表示两个洞穴的编号。

Output

对每个Query指令,输出洞穴u和洞穴v是否互相连通:是输出”Yes”,否则输出”No”。(不含双引号)

Sample Input

样例输入1 cave.in

200 5

Query 123 127

Connect 123 127

Query 123 127

Destroy 127 123

Query 123 127

样例输入2 cave.in

3 5

Connect 1 2

Connect 3 1

Query 2 3

Destroy 1 3

Query 2 3

Sample Output

样例输出1 cave.out

No

Yes

No

样例输出2 cave.out

Yes

No

HINT

数据说明 10%的数据满足n≤1000, m≤20000 20%的数据满足n≤2000, m≤40000 30%的数据满足n≤3000, m≤60000 40%的数据满足n≤4000, m≤80000 50%的数据满足n≤5000, m≤100000 60%的数据满足n≤6000, m≤120000 70%的数据满足n≤7000, m≤140000 80%的数据满足n≤8000, m≤160000 90%的数据满足n≤9000, m≤180000 100%的数据满足n≤10000, m≤200000 保证所有Destroy指令将摧毁的是一条存在的通道本题输入、输出规模比较大,建议c\c++选手使用scanf和printf进行I\O操作以免超时

Solution

  • 一颗简单的LCT 。

  • 只需维护连边、断边、判断两个点是否在同一集合三个操作即可。

Code

#include<cstdio>
#include<algorithm>
#include<cctype>
using namespace std;
const int N=1e4+5;
int top;
int s[N][2],fa[N],st[N];
bool rev[N];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline bool pd(int x)
{return s[fa[x]][1]==x;
}
inline bool isroot(int x)
{return s[fa[x]][0]^x && s[fa[x]][1]^x;
}
inline void modify(int x)
{if(x) rev[x]^=1,swap(s[x][0],s[x][1]);
}
inline void down(int x)
{if(rev[x]){modify(s[x][0]),modify(s[x][1]);rev[x]=false;}
}
inline void rotate(int x)
{int y=fa[x],w=pd(x);if(s[y][w]=s[x][w^1]) fa[s[x][w^1]]=y;if((fa[x]=fa[y]) && !isroot(y)) s[fa[y]][pd(y)]=x;s[fa[y]=x][w^1]=y;
}
inline void splay(int x)
{for(int y=st[top=1]=x;!isroot(y);y=fa[y]) st[++top]=fa[y];while(top) down(st[top--]);for(int y;!isroot(x);rotate(x))if(!isroot(y=fa[x])) rotate(pd(x)==pd(y)?y:x);
}
inline void access(int x)
{for(int y=0;x;x=fa[y=x]) splay(x),s[x][1]=y;
}
inline void mkroot(int x)
{access(x),splay(x),modify(x);
}
inline void link(int x,int y)
{mkroot(x),fa[x]=y;
}
inline void cut(int x,int y)
{mkroot(x),access(y),splay(y);s[y][0]=fa[x]=0;
}
inline bool query(int x,int y)
{mkroot(x),access(y),splay(y);int z=y;while(s[z][0]) z=s[z][0];return x==z;
}
int main()
{int n=read(),m=read();while(m--){char ch=getchar();while(ch^'Q' && ch^'D' && ch^'C') ch=getchar();if(ch=='D') cut(read(),read()); elseif(ch=='C') link(read(),read()); elseputs(query(read(),read())?"Yes":"No");}return 0;
}

BZOJ 2049: [Sdoi2008]Cave 洞穴勘测相关推荐

  1. BZOJ 2049: [Sdoi2008]Cave 洞穴勘测——LCT

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2049 省选之前来切一道数据结构模板题. 题意 这是一道模板题. N个点,M次操作,每次加边/ ...

  2. bzoj2049 [Sdoi2008]Cave 洞穴勘测

    [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MB Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为J ...

  3. [SDOI2008]Cave 洞穴勘测

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

  4. bzoj2049 [Sdoi2008]Cave 洞穴勘测——LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2049 第二道LCT! 这题是模板题,写了一遍以后感觉对LCT的认识又加深了. 代码如下: # ...

  5. bzoj2049: [Sdoi2008]Cave 洞穴勘测

    [题意] 给你一个森林,要求支持动态加边删边,并会询问在某一个时刻两点是否联通. [题解] 裸的lct,模版题.第一次写对lct,没写过真的难写.... [代码] 1 #include <ios ...

  6. bzoj2049 Cave 洞穴勘测 LCT模版

    2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec  Memory Limit: 259 MB Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了 ...

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

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

  8. SDOI 2008 洞穴勘测

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

  9. 【LCT】洞穴勘测(luogu 2147/金牌导航 LCT-1)

    洞穴勘测 luogu 2147 金牌导航 LCT-1 题目大意 给你若干操作,有三种操作: 1.连接两个点 2.吧两个点之间的连边断掉(保证有这条边) 3.查询两个点之间是否连通 样例 #1 输入样例 ...

最新文章

  1. 好记性不如烂博客之 Quartz InterruptableJob 可拦截任务
  2. 这些年,在工作中摸索的我
  3. 双屏鼠标经常跑到副屏_1+1gt;2,让ipad变成你的电脑副屏
  4. SQL优化之列裁剪和投影消除
  5. C和指针之字符串之strncpy、strncat、strncmp
  6. 第一类修正贝塞尔函数的C语言实现
  7. 定义整型数组_C++数组的定义与初始化(学习笔记:第6章 01)
  8. (转)Hibernate关联映射——对象的三种关系
  9. 2021福州地区高考成绩排名查询,2021年福州各高中高考成绩排名及放榜最新消息...
  10. 学习CodeIgniter框架之旅(二)继承自定义类
  11. PHP正则匹配6到16位字符组合(且只能为数字、字母、下划线)
  12. 《Cacti实战》——2.2 安装与配置相关组件和服务
  13. 计算机毕业设计nodejs宠物寄存管理系统
  14. office Excel操作
  15. ssm毕设项目iGame游戏交易平台nzln3(java+VUE+Mybatis+Maven+Mysql+sprnig)
  16. 百度网盘——下载限速问题解决方案(油猴(Tampermonkey)+百度网盘直链下载助手+IDM)
  17. 【100%通过率】华为OD机试真题 JS 实现【预订酒店】【2023 Q1 | 100分】
  18. java制作我的世界_Minecraft Java版整合包制作教程
  19. stm32f105vct6例程_stm32f105例程 CAN500K USART_LED
  20. 【MySQL集群】——Java程序连接MySQL集群

热门文章

  1. MATLAB 转PDF图片过大导致两边缺失
  2. 现代谱估计:MTM 谐波分析
  3. 正则化与L0、L1、L2范数略解
  4. stm32串口通信(初学者对于串口通信的理解)
  5. 6、VTK基本数据结构
  6. 众筹网02_项目环境搭建
  7. 详解 TCP 和 UDP
  8. [云炬创业基础笔记]第十一章创业计划书测试9
  9. USTC English Club Note20211212
  10. Windows2000下Api函数的拦截分析