[BZOJ2049] [SDOI2008] 洞穴勘测
题目描述
辉辉热衷于洞穴勘测。
某天,他按照地图来到了一片被标记为JSZX的洞穴群地区。经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴。假如两个洞穴可以通过一条或者多条通道按一定顺序连接起来,那么这两个洞穴就是连通的,按顺序连接在一起的这些通道则被称之为这两个洞穴之间的一条路径。 洞穴都十分坚固无法破坏,然而通道不太稳定,时常因为外界影响而发生改变,比如,根据有关仪器的监测结果,123号洞穴和127号洞穴之间有时会出现一条通道,有时这条通道又会因为某种稀奇古怪的原因被毁。
辉辉有一台监测仪器可以实时将通道的每一次改变状况在辉辉手边的终端机上显示:
如果监测到洞穴u和洞穴v之间出现了一条通道,终端机上会显示一条指令 Connect u v
如果监测到洞穴u和洞穴v之间的通道被毁,终端机上会显示一条指令 Destroy u v
经过长期的艰苦卓绝的手工推算,辉辉发现一个奇怪的现象:无论通道怎么改变,任意时刻任意两个洞穴之间至多只有一条路径。
因而,辉辉坚信这是由于某种本质规律的支配导致的。因而,辉辉更加夜以继日地坚守在终端机之前,试图通过通道的改变情况来研究这条本质规律。 然而,终于有一天,辉辉在堆积成山的演算纸中崩溃了……他把终端机往地面一砸(终端机也足够坚固无法破坏),转而求助于你,说道:“你老兄把这程序写写吧”。
辉辉希望能随时通过终端机发出指令 Query u v
,向监测仪询问此时洞穴u和洞穴v是否连通。现在你要为他编写程序回答每一次询问。 已知在第一条指令显示之前,JSZX洞穴群中没有任何通道存在。
输入输出格式
输入格式:
第一行为两个正整数n和m,分别表示洞穴的个数和终端机上出现过的指令的个数。 以下m行,依次表示终端机上出现的各条指令。每行开头是一个表示指令种类的字符串s("Connect”、”Destroy”或者”Query”,区分大小写),之后有两个整数u和v (1≤u, v≤n且u≠v) 分别表示两个洞穴的编号。
输出格式:
对每个Query指令,输出洞穴u和洞穴v是否互相连通:是输出”Yes”,否则输出”No”。(不含双引号)
输入输出样例
200 5 Query 123 127 Connect 123 127 Query 123 127 Destroy 127 123 Query 123 127
No Yes No
3 5 Connect 1 2 Connect 3 1 Query 2 3 Destroy 1 3 Query 2 3
Yes No
说明
数据说明
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操作以免超时
题解
一道LCT的板子题
连边就直接link
删边直接cut
查询是否联通用findroot操作
1 //minamoto 2 #include<cstdio> 3 #include<algorithm> 4 #include<cctype> 5 #include<map> 6 #define N 10005 7 using namespace std; 8 inline int read(){ 9 #define num ch-'0' 10 char ch;bool flag=0;int res; 11 while(!isdigit(ch=getchar())) 12 (ch=='-')&&(flag=true); 13 for(res=num;isdigit(ch=getchar());res=res*10+num); 14 (flag)&&(res=-res); 15 #undef num 16 return res; 17 } 18 namespace lct{ 19 int top,s[N],ch[N][2],fa[N];bool rev[N]; 20 bool isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;} 21 void pushdown(int x){if(rev[x])swap(ch[x][0],ch[x][1]),rev[ch[x][0]]^=1,rev[ch[x][1]]^=1,rev[x]^=1;} 22 void rotate(int x){ 23 int y=fa[x],z=fa[y],d=(ch[y][1]==x);if(!isroot(y)) ch[z][ch[z][1]==y]=x; 24 fa[x]=z,fa[y]=x;fa[ch[x][d^1]]=y,ch[y][d]=ch[x][d^1],ch[x][d^1]=y; 25 } 26 void splay(int x){ 27 s[top=1]=x;for(int i=x;!isroot(i);i=fa[i]) s[++top]=fa[i];for(int i=top;i>=1;--i) pushdown(s[i]); 28 for(int y=fa[x],z=fa[y];!isroot(x);y=fa[x],z=fa[y]){ 29 if(!isroot(y)) ((ch[z][1]==y)^(ch[y][1]==x))?rotate(x):rotate(y);rotate(x); 30 } 31 } 32 void access(int x){int t=0;while(x){splay(x),ch[x][1]=t,t=x,x=fa[x];}} 33 void makeroot(int x){access(x),splay(x),rev[x]^=1;} 34 int findroot(int x){access(x);splay(x);pushdown(x);while(ch[x][0]) pushdown(x=ch[x][0]);return x;} 35 void link(int x,int y){makeroot(x),access(y),splay(y),fa[x]=y;} 36 void cut(int x,int y){makeroot(x),access(y),splay(y),fa[x]=ch[y][0]=0;} 37 } 38 using namespace lct; 39 int main(){ 40 //freopen("testdata.in","r",stdin); 41 int n,m; 42 n=read(),m=read(); 43 while(m--){ 44 char s[10];int u,v; 45 scanf("%s",s),u=read(),v=read(); 46 switch(s[0]){ 47 case 'C':link(u,v);break; 48 case 'D':cut(u,v);break; 49 case 'Q':puts(findroot(u)==findroot(v)?"Yes":"No"); 50 } 51 } 52 return 0; 53 }
转载于:https://www.cnblogs.com/bztMinamoto/p/9341232.html
[BZOJ2049] [SDOI2008] 洞穴勘测相关推荐
- BZOJ-2049 [SDOI2008]洞穴勘测
LCT模版题.... #include <cstdlib> #include <cstdio> #include <cstring> #include <al ...
- bzoj2049 Cave 洞穴勘测 LCT模版
2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MB Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了 ...
- 题解 洛谷P2147/BZOJ2049【[SDOI2008]洞穴勘测】
Link-Cut-Tree的模板题啊......(听说还可以用其他的方法做,不管了,直接上LCT) 没有要求维护点权,只需要维护点的连通性即可. 就是朴素的LCT,居然还不要pushup. 感觉有些不 ...
- 洛谷P2147[SDOI2008]洞穴勘测
题目 LCT,或者并查集水过. 首先并查集这道题不能路径压缩,因为路径压缩是为了用牺牲一些信息的方法来加快速度,可是这道题我们需要这个信息,所以不能路径压缩. 剩下的操作就只剩下了暴力并查集,而每次查 ...
- 【题解】Luogu P2147 [SDOI2008]洞穴勘测
原题传送门 这题用Link-Cut-Tree解决,Link-Cut-Tree详解 我不太会踩爆Link-Cut-Tree的并查集做法qaq 我们用Link-Cut-Tree维护连通性(十分无脑) Co ...
- bzoj2049 [Sdoi2008]Cave 洞穴勘测
[Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MB Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为J ...
- BZOJ 2049: [Sdoi2008]Cave 洞穴勘测
Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...
- [SDOI2008]Cave 洞穴勘测
题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假 ...
- 【LCT】洞穴勘测(luogu 2147/金牌导航 LCT-1)
洞穴勘测 luogu 2147 金牌导航 LCT-1 题目大意 给你若干操作,有三种操作: 1.连接两个点 2.吧两个点之间的连边断掉(保证有这条边) 3.查询两个点之间是否连通 样例 #1 输入样例 ...
最新文章
- 自己开发开源jquery插件--给jquery.treeview加上checkbox
- DNS报文格式(RFC1035)
- Android studio如何使用SVN进行版本控制?
- NYOJ 14 会场安排问题
- springframework包下的RequestContextHolder类和ServletRequestAttributes类的源码和使用
- opengl绘制长方体线框_OpenGL绘制长方体
- JBoss BRMS复杂事件处理(CEP)性能基准
- 教你如何进入有密码的 XP 系统(下)
- python字符串查找的四种方法_Python中的字符串查找操作方法总结
- (10)Microsoft office Word 2013版本操作入门_word表格
- android 获取全局context,说说 Android 中如何在全局获取 Context
- Java匹马行天下之C国程序员的秃头原因
- 驱动兼容_「图」英特尔DCH驱动新版发布:重点修复Windows 10兼容性问题
- 【雷达】一维和二维自适应波束形成(DBF))DBF附matlab代码
- oracle c# 插入中文乱码,C#写入Oracle 中文乱码问题
- er图转关系模式规则_ER模型到关系模型的转换规则
- 周杰伦新专辑预售热点传播渠道分析
- 阿里云-云开发平台普及篇——创建应用
- Android原生OS风格ROM包,小米5S 的LineageOS14.1刷机包 安卓7.1.1原生风格 20180203更新...
- Python数据可视化的3大步骤!
热门文章
- 减少系统进程【ZT】
- cpp 条件判断 大于等于_07.合意就执行,不行就拉倒-if/else条件控制(一)
- go sublime mysql_Sublime text 3开发GO
- [Es] Rejecting mapping update to [xxx] as the final mapping would have more than 1 type [xxx xxx]
- 【Elasticsearch】Elasticsearch 集群健康值黄色 解决方案 或者 分片 未分配
- 【Docker】elasticsearch 监控工具 elasticsearch-HQ Unable to create connection to: http://localhost:9200
- 【Flink】Flink 与数据库的集成最佳实践 【视频笔记】
- 【MyBatis】Mybatis使用SqlSessionFactory加载xml文件
- MySQL : mysql连接报 Communications link failure
- 95-140-108-源码-transform-算子process