[Sdoi2008]Cave 洞穴勘测

Time Limit: 10 Sec Memory Limit: 259 MB

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操作以免超时

写完这道题,我的LCT就有入门的可能啦!!!
LCT感觉好强的样子。。。。。写完板子后就是一通极其麻溜的操作的感觉是真的开心。。。


#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5, L = 0, R = 1;
struct lpl{int fa, rev, size, son[2];
}node[maxn];
int n, m, top, st[maxn];namespace LCT{inline bool get(int x){return (node[node[x].fa].son[R] == x);}inline bool isroot(int x){return (node[node[x].fa].son[L] != x && node[node[x].fa].son[R] != x);}inline void update(int x){node[x].size = node[node[x].son[L]].size + node[node[x].son[R]].size + 1;}inline void pushdown(int x){if(!node[x].rev) return; node[x].rev = 0;node[node[x].son[L]].rev ^= 1; node[node[x].son[R]].rev ^= 1;swap(node[x].son[L], node[x].son[R]);}inline void rotate(int x){pushdown(x); int fa = node[x].fa, grdfa = node[fa].fa, which = (node[fa].son[R] == x);if(!isroot(fa)) node[grdfa].son[node[grdfa].son[R] == fa] = x; node[x].fa = grdfa;node[fa].son[which] = node[x].son[which ^ 1]; node[node[fa].son[which]].fa = fa;node[x].son[which ^ 1] = fa; node[fa].fa = x;update(fa); update(x);}inline void splay(int x){st[top = 1] = x;for(int i = x; !isroot(i); i = node[i].fa) st[++top] = node[i].fa;for(int i = top; i; i--) pushdown(st[i]);for(int fa; !isroot(x); rotate(x))if(!isroot(fa = node[x].fa)) rotate(get(x) == get(fa) ? fa : x);}inline void access(int x){for(int y = 0; x; y = x, x = node[x].fa) splay(x), node[x].son[R] = y;}inline void makeroot(int x){access(x), splay(x), node[x].rev ^= 1;}inline void link(int x, int y){makeroot(x); node[x].fa = y; splay(x);}inline void cut(int x, int y){makeroot(x); access(y); splay(y); node[x].fa = node[y].son[L] = 0;}inline int find(int x){access(x); splay(x); while(node[x].son[L]) x = node[x].son[L]; return x;}
}int main()
{scanf("%d%d", &n, &m); char s[25]; int u, v;while(m--){scanf("%s", s + 1); scanf("%d%d", &u, &v);if(s[1] == 'C') LCT::link(u, v);if(s[1] == 'D') LCT::cut(u, v);if(s[1] == 'Q') (LCT::find(u) == LCT::find(v)) ? (printf("Yes\n")) : (printf("No\n"));}return 0;
}

转载于:https://www.cnblogs.com/LLppdd/p/9582525.html

bzoj2049 [Sdoi2008]Cave 洞穴勘测相关推荐

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

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

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

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

  3. BZOJ 2049: [Sdoi2008]Cave 洞穴勘测

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

  4. [SDOI2008]Cave 洞穴勘测

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

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

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

  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. 自动驾驶中的计算机视觉
  2. MySQL数据模型图导出ddl脚本_DB2中导出数据库的所有DDL脚本.
  3. 串口ISPHUB制作
  4. linux wm虚拟机网络,复制多台虚拟机及简单的网络配置
  5. 008_Maven Eclipse
  6. Apache shiro介绍
  7. 从《我要投资》,看麓谷基金广场的“孤峰优势”
  8. python简笔画绘制 数据驱动绘图恐龙_使用python turtle绘制简笔画大白-Go语言中文社区...
  9. telnet远程登陆、mstsc远程控制、SSH之间的比较和区别
  10. Exchange系列之exchange2003sp2部署
  11. idea 跳转到行数,Intellij IDEA 一些不为人知的技巧
  12. 电商知识图谱的构建及搜索推荐场景下的应用实践
  13. python中两个文件如何互相传参_argparse模块如何在jupyter notebook中用于传参?
  14. 矩阵线性代数笔记整理汇总,超全面
  15. linux应用程序故障排查,为Linux应用程序排查故障的另类方法
  16. 1bit等于多少字节,换算方法??
  17. 锐捷网络 ipv6 默认路由配置
  18. Android客户端入门开发
  19. MYSQL统一社会信用代码校验函数
  20. git中的revert和reset

热门文章

  1. rsync的原理——转载
  2. Android AsyncTask简单用法
  3. 好久没有写什么东西了。。。。
  4. 4e4 Coursework decomposition
  5. A value-added tax (VAT) IN UK
  6. new housing price at shanghai
  7. Notification通知栏
  8. uGUI知识点剖析之RectTransform
  9. 自定义Checkbox让复选框居中对于RadioButton同样适用
  10. 智慧办公的AI博弈——看飞企互联如何接招!