题目大意:有$n$个洞穴,$m$条指令,指令有三种

  1. $Connect\;u\;v$:在$u,v$之间连一条边
  2. $Destroy\;u\;v$:切断$u,v$之间的边
  3. $Query\;u\;v$:询问$u,v$是否连通

(数据保证合法)

题解:$LCT$(潘佳奇的板子)

卡点:无(潘佳奇的板子)

C++ Code:

#include <cstdio>
#include <cstring>
#define maxn 10010
using namespace std;
int son[2][maxn], fa[maxn], tg[maxn];
inline bool get(int x, int flag = 1) {return son[flag][fa[x]] == x;}
inline bool is_root(int x) {return !(get(x, 0) || get(x, 1));}
inline void swap(int &x, int &y) {x ^= y ^= x ^= y;}
inline void rotate(int x) {
int y = fa[x], z = fa[y]; bool b = get(x);
if (!is_root(y)) son[get(y)][z] = x;
son[b][y] = son[!b][x]; son[!b][x] = y;
fa[y] = x; fa[x] = z; fa[son[b][y]] = y;
}
inline void pushdown(int x) {
if (tg[x]) {
tg[son[0][x]] ^= 1; tg[son[1][x]] ^= 1;
swap(son[0][x], son[1][x]); tg[x] ^= 1;
}
}
int st[maxn], top;
inline void splay(int x) {
st[top = 1] = x;
for (int y = x; !is_root(y); st[++top] = y = fa[y]);
for (; top; --top) if (tg[st[top]]) pushdown(st[top]);
for (; !is_root(x); rotate(x)) if (!is_root(fa[x]))
get(x) ^ get(fa[x]) ? rotate(x) : rotate(fa[x]);
}
inline void access(int x) {for (int t = 0; x; son[1][x] = t, t = x, x = fa[x]) splay(x);}
inline void make_root(int x) {access(x); splay(x); tg[x] ^= 1;}
inline void split(int x, int y) {make_root(x); access(y); splay(y);}
inline void link(int x, int y) {make_root(x); fa[x] = y;}
inline void cut(int x, int y) {split(x, y); son[0][y] = fa[x] = 0;}
inline bool query(int x, int y) {
split(x, y); int now = y;
while (son[0][now]) now = son[0][now];
return now == x;
}
int n, Q, x, y;
char s[30];
int main() {
scanf("%d%d", &n, &Q);
while (Q --> 0) {
scanf("%s%d%d", s, &x, &y);
if (s[0] == 'Q') {
if (query(x, y)) puts("Yes");
else puts("No");
} else {
if (s[0] == 'C') link(x, y);
else cut(x, y);
}
}
return 0;
}

[洛谷P2147][SDOI2008]洞穴勘测的更多相关文章

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

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

  2. 洛谷 P2147 [SDOI2008]洞穴勘测 (线段树分治)

    题目链接 题解 早就想写线段树分治的题了. 对于每条边,它存在于一段时间 我们按时间来搞 我们可把一条边看做一条线段 我们可以模拟线段树操作,不断分治下去 把覆盖\(l-r\)这段时间的线段筛选出来, ...

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

    以下这个做法应该是叫线段树分治... 根据修改操作预处理出每条边存在的时间区间[l,r](以操作序号为时间),然后把所有形式化后的修改挂到线段树节点上. 处理完修改后,dfs一遍线段树,进入某个节点时 ...

  4. 洛谷 P2147 [SDOI2008]洞穴勘测 LCT

    Code: #include <cstdio> #include <algorithm> #include <string> #include <cstrin ...

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

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

  6. 【洛谷P2147】洞穴勘测

    题目大意:维护 N 个点的无向图,支持动态加边和删边,回答两点的连通性. 题解:线段树分治 + 可撤销并查集 询问可以离线,这是线段树分治的基础. 建立在操作时间轴上的线段树称为线段树分治算法. 本题 ...

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

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

  8. P2147 [SDOI2008]洞穴勘测

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

  9. 洛谷P2147 [SDOI2008]Cave 洞穴勘测

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

随机推荐

  1. Maven命令参数

    命令参数 备注 mvn -v --version 显示版本信息; mvn -V --show-version 显示版本信息后继续执行Maven其他目标; mvn -h --help 显示帮助信息; m ...

  2. (转)IP地址分配原理

    网络模型介绍 在计算机网络中有著名的OSI七层协议体系结构,概念清楚,理论完整,但是它既复杂又不实用.TCP/IP体系结构则不同,得到的广泛的应用.最终结合OSI和TCP/IP的优点,采用了一种只有五 ...

  3. scrapy爬取伯乐在线文章数据

    创建项目 切换到ArticleSpider目录下创建爬虫文件 设置settings.py爬虫协议为False 编写启动爬虫文件main.py

  4. django之多表查询

    一.创建模型 在Models创建如下模型: from django.db import models # Create your models here. # 用了OneToOneField和Fore ...

  5. ruby require的使用

    引用单个文件 例: 引用当前rb同目录下的file_to_require.rb先介绍3种方法 require File.join(__FILE__, '../file_to_require') req ...

  6. http一些常见知识记录

    HTTP请求包(浏览器信息) 我们先来看看Request包的结构, Request包分为3部分,第一部分叫Request line(请求行), 第二部分叫Request header(请求头),第三部 ...

  7. 1321. [ZJOI2012] 灾难

    1321. [ZJOI2012] 灾难 ★★☆   输入文件:catas.in   输出文件:catas.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 阿米巴是小强的 ...

  8. 涉及到大小变化,类似QScrollArea判断大小是否显示滚动条

    涉及到大小变化,类似QScrollArea判断大小是否显示滚动条的情况要注意 这两个属性的设置:

  9. inline-block 空隙

    IE8-9.Firefox.Safari 是4px Chrome下是8px 出现原因 标签换行引起 解决方案网上很多 但是在布局中尽量避免使用inline-block

  10. cocos2d-x 键盘和鼠标事件

    出了菜单可以响应用户事件外,cocos2d中的层(Layer)也可以响应事件.层能够自动响应窗口事件,这些事件主要是键盘和鼠标事件,cocos2d中事件处理是通过Pyglet的事件处理完成的. 1.键 ...