[bzoj] 2049 洞穴勘探 || LCT
原题
这是一道LCT的板子题。
至于LCT——link cut tree,也叫动态树,用splay实现动态连边的树。
预备知识:
实边:一个非叶节点,向它的儿子中的一个连一条特殊的边,称为实边;该非叶节点向它的其他儿子所引的边均为虚边。注意,对于某些非叶节点,它与它儿子们所连的边可能全部是虚边
LCT的操作:
access(x) ——将x到根的路径变成实路径(该实路径的端点为根和x)
makeroot(x) ——将x变为所在树的根节点
findroot(x) ——查找x所在树的根节点
link(x,y) ——连接x与y
cut(x,y) ——切断x与y的边
这道题询问连通性,所以只要findroot是否一样即可
AC代码:
#include<cstdio>
#include<algorithm>
#define N 100010
#define which(u) (ls[fa[(u)]]==(u))
#define isroot(u) (!fa[(u)] || (ls[fa[(u)]]!=(u) && rs[fa[u]]!=(u)))
using namespace std;
int n,m,fa[N],ls[N],rs[N];
bool rev[N];
char s[20];
void rotate(int u)
{
int v=fa[u],w=fa[v],b=which(u)?rs[u]:ls[u];
if (!isroot(v)) (which(v)?ls[w]:rs[w])=u;
which(u)?(ls[v]=b,rs[u]=v):(rs[v]=b,ls[u]=v);
fa[u]=w,fa[v]=u;
if (b) fa[b]=v;
}
void pushdown(int u)
{
if (!rev[u]) return ;
rev[ls[u]]^=1;
rev[rs[u]]^=1;
swap(ls[u],rs[u]);
rev[u]=0;
}
void splay(int u)
{
static int stk[N],top;
stk[top=1]=u;
while (!isroot(stk[top])) stk[top+1]=fa[stk[top]],top++;
while (top) pushdown(stk[top--]);
while (!isroot(u))
{
if (!isroot(fa[u]))
{
if (which(u)==which(fa[u])) rotate(fa[u]);
else rotate(u);
}
rotate(u);
}
}
void access(int u)
{
int v=0;
while (u)
{
splay(u);
rs[u]=v;
v=u;
u=fa[u];
}
}
void makeroot(int u)
{
access(u);
splay(u);
rev[u]^=1;
}
int findroot(int u)
{
access(u);
splay(u);
while (pushdown(u),ls[u]) u=ls[u];
splay(u);
return u;
}
void link(int u,int v)
{
makeroot(v);
fa[v]=u;
}
void cut(int u,int v)
{
makeroot(u);
access(v);
splay(v);
ls[v]=fa[u]=0;
}
int main()
{
scanf("%d%d",&n,&m);
while (m--)
{
int u,v;
scanf("%s",s+1);
scanf("%d%d",&u,&v);
if (s[1]=='C') link(u,v);
else if (s[1]=='Q') findroot(u)==findroot(v)?puts("Yes"):puts("No");
else cut(u,v);
}
return 0;
}
[bzoj] 2049 洞穴勘探 || LCT的更多相关文章
- 洛谷P2147 [SDOI2008] 洞穴勘探 [LCT]
题目传送门 洞穴勘探 题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道 ...
- BZOJ 2049 洞穴勘测
LCT判断联通性 没什么特别的..还是一个普通的板子题,把LCT当并查集用了,只不过LCT灵活一些,还可以断边 话说自从昨天被维修数列那题榨干之后我现在写splay都不用动脑子了,,机械式的码spla ...
- BZOJ 2049洞穴探测
辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如两个洞穴可 ...
- [BZOJ 2049] [Sdoi2008] Cave 洞穴勘测 【LCT】
题目链接:BZOJ - 2049 题目分析 LCT的基本模型,包括 Link ,Cut 操作和判断两个点是否在同一棵树内. Link(x, y) : Make_Root(x); Splay(x); F ...
- ●BZOJ 2049 [Sdoi2008]Cave洞穴勘测
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2049 题解: LCT入门题 就是判两个点是否在同一颗树里 代码: #include<c ...
- [SDOI2008] 洞穴勘测 (LCT模板)
bzoj 2049 传送门 洛谷P2147 传送门 这个大佬的LCT详解超级棒的! Link-Cut Tree的基本思路是用splay的森林维护一条条树链. splay的森林,顾名思义,就是若干spl ...
- [BZOJ - 2631] tree 【LCT】
题目链接:BZOJ - 2631 题目分析 LCT,像线段树区间乘,区间加那样打标记. 这道题我调了一下午. 提交之后TLE了,我一直以为是写错了导致了死循环. 于是一直在排查错误.直到.. 直到我看 ...
- BZOJ 2049: [Sdoi2008]Cave 洞穴勘測 LCT
入门级LCT: 仅仅有 Cut Link 2049: [Sdoi2008]Cave 洞穴勘測 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 3073 ...
- bzoj 2049: [Sdoi2008]Cave 洞穴勘测 (LCT)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2049 题面: 2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 1 ...
随机推荐
- Linux tcpdump命令详解(分享文章)
简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...
- [wirtting] top01 independent
Do you agree or disagree with the following statement? At universities and colleges, sports and soci ...
- 进度条加载与案例优化对比——python使用perf_count方法实现
本章我们将讨论python3 perf_counter()的用法及它的实际应用我从中选取两个python基于rquests库的爬虫实例代码源文件进行举例 Python3 perf_counter() ...
- lintcode172 删除元素
删除元素 给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度. 元素的顺序可以改变,并且对新的数组不会有影响. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一个数组 [0, ...
- 同台服务器 部署多个tomcat 需要做的修改
需要修改以下加粗部分: 1:访问端口 8080->8081 2:shutdown 端口 8005->8015 3: AJP端口 8001->8010 <?xml version ...
- pandas协助工具
pandas有时候操作很不方便,也有可能是我不熟练吧,反正就是各种别扭.下面是我写的一个简单的json数据操作工具,能够完成简单的数据分析工作,后续会不断完善的 # coding=utf-8 impo ...
- 如何在etherscan提交代币官方信息
https://ethlinkersupport.zendesk.com/hc/zh-cn/articles/360001334992-%E5%A6%82%E4%BD%95%E5%9C%A8ether ...
- FZU 1844 Earthquake Damage(最大流最小割)
Problem Description Open Source Tools help earthquake researchers stay a step ahead. Many geological ...
- 又见CLOSE_WAIT
原文: http://mp.weixin.qq.com/s?__biz=MzI4MjA4ODU0Ng==&mid=402163560&idx=1&sn=5269044286ce ...
- 调试Python的方式
调试Python有如下几种方式: 1 使用print语句 2 使用IDE的debuggers 3 使用命令行调试器pdb,这是Python的一个标准库,类似gdb 4 使用-i命令行选项.在使用命令行 ...