bzoj 2049 传送门

洛谷P2147 传送门

这个大佬的LCT详解超级棒的!

Link-Cut Tree的基本思路是用splay的森林维护一条条树链。

splay的森林,顾名思义,就是若干splay组成的东西。

每个splay都有一个根节点,所以lct里的splay不能记录根节点,因为根节点有好多。

我们开一个bool数组记录每个点是否为根节点。

每个splay都维护一条重链,重链之间的轻链在splay里只从儿子指向父亲,而父亲并没有这个儿子。

就像图里的红箭头。

每个splay都表示一条重链,这个splay的中序遍历与链上节点的深度顺序是一致的。

接下来是splay里最重要的操作:access(p)

就是指打通从p到整棵树的树根的一条重链。

同时也把p下面接的链变成轻链。

之后还有一个操作:move_to_root,把p变成整棵树的根。

在access之后,p和树根之间是重链直接连接,而一个splay维护一个重链,所以此时p和根已经在一个splay里了。

我们只需要splay(p)即可。

但是这样的话破坏了深度的性质。

把左右反转一下就行了:reverse(p)

接下来就是link和cut的操作。

link(x,y)很简单,mtr(x),之后接一条从x到y的轻链即可。

cut(x,y)的话,mtr(x),access(y),splay(y),x就是y的左儿子了。删掉父子关系即可。

查询连通性:mtr(x),access(y),splay(y),x就在y的子树里了。x=f[x]一直往上跳,判断最后y的终点是不是x。

这些大概是最最基础的操作了,子树信息什么的都不用维护。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define id(x) (s[f[x]][1]==x)
using namespace std; int n,m;
int f[],s[][];
bool rev[],rt[]; void reverse(int p)
{
swap(s[p][],s[p][]);
rev[p]^=;
} void pushdown(int p)
{
if(!rev[p])return;
reverse(s[p][]);
reverse(s[p][]);
rev[p]=;
} void down(int p)
{
if(!rt[p])down(f[p]);
pushdown(p);
} void rotate(int p)
{
int k=id(p);
int fa=f[p];
if(rt[fa])rt[p]=,rt[fa]=;
else s[f[fa]][id(fa)]=p;
s[fa][k]=s[p][!k];
s[p][!k]=fa;
f[p]=f[fa];
f[fa]=p;
f[s[fa][k]]=fa;
} void splay(int p)
{
down(p);
while(!rt[p])
{
int fa=f[p];
if(rt[fa])
{
rotate(p);
return;
}
if(id(p)^id(fa))rotate(p);
else rotate(fa);
rotate(p);
}
} void access(int p)
{
int son=;
while(p)
{
splay(p);
rt[s[p][]]=,rt[son]=;
s[p][]=son;
son=p,p=f[p];
}
} void mtr(int p)
{
access(p);
splay(p);
reverse(p);
} void link(int x,int y)
{
mtr(x);
f[x]=y;
} void cut(int x,int y)
{
mtr(x);
access(y);
splay(y);
s[y][]=f[x]=;
rt[x]=;
} void check(int x,int y)
{
mtr(x);
access(y);
splay(y);
while(!rt[x])x=f[x];
printf("%s\n",(x==y?"Yes":"No"));
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)rt[i]=;
char op[];
int x,y;
while(m--)
{
scanf("%s",op+);
scanf("%d%d",&x,&y);
if(op[]=='C')link(x,y);
if(op[]=='D')cut(x,y);
if(op[]=='Q')check(x,y);
}
return ;
}

[SDOI2008] 洞穴勘测 (LCT模板)的更多相关文章

  1. [BZOJ2049][Sdoi2008]Cave 洞穴勘测 LCT模板

    2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 9705  Solved: 4674[Submit] ...

  2. BZOJ2049[Sdoi2008]洞穴勘测——LCT

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

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

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

  4. [LuoguP2147] [SDOI2008]洞穴勘测 (LCT维护连通性)

    题面 传送门:https://www.luogu.org/problemnew/show/P2147 Solution 这题...... 我们可以发现题目要求我们维护一个动态森林,而且只查询连通性.. ...

  5. BZOJ 2049 SDOI2008 洞穴勘测 LCT板子

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2049 题意概述:给出N个点,一开始不连通,M次操作,删边加边,保证图是一个森林,询问两点连 ...

  6. BZOJ 2049 [SDOI2008]洞穴勘测 (LCT)

    题目大意:维护一个森林,支持边的断,连,以及查询连通性 LCT裸题 洛谷P2147传送门 1A了,给自己鼓鼓掌 #include <cstdio> #include <algorit ...

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

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

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

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

  9. P2147 [SDOI2008]洞穴勘测

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

随机推荐

  1. 面向对象 part5

    构造函数模式与原型模式结合 function Person(name) = { this.name = name this.friends = ["a", "b" ...

  2. Maven--传递性依赖和依赖范围

    依赖范围不仅可以控制依赖与三种 classpath 的关系,还对传递性依赖产生影响. 假设 A 依赖于 B,B依赖于 C,我们说 A 对于 B 是第一直接依赖,B 对于 C 是第二直接依赖,A 对于 ...

  3. 关于Vue.js的认识(第一部分)[转载]

    一.关于v-bind 1.初识v-bind (1).加冒号的是 vue 的 v-bind 语法糖(指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用),绑定vue的一个 ...

  4. cJSON api的使用教程

    背景说明:由于和后台通信,为了统一数据格式,选择使用json格式,客户端开发语言使用的是c,故需要借助第三方库来实现json格式的转化,cJSON是一个很好的第三方库, 下载链接1:https://g ...

  5. 20199324《Linux内核原理与分析》第十一周作业

    SET-UID程序漏洞实验 一.实验简介 Set-UID 是 Unix 系统中的一个重要的安全机制.当一个 Set-UID 程序运行的时候,它被假设为具有拥有者的权限.例如,如果程序的拥有者是root ...

  6. RDD(九)——序列化问题

    在实际开发中我们往往需要自己定义一些对于RDD的操作,那么此时需要考虑的主要问题是,初始化工作是在Driver端进行的,而实际运行程序是在Executor端进行的,这就涉及到了跨进程通信,是需要序列化 ...

  7. TPO3-2Depletion of Ogallala Aquifer

    The vast grasslands of the High Plains in the central United States were settled by farmers and ranc ...

  8. linkage disequilibrium|linkage equilibrium

    I.9 Linkage INDEPENDENCE OF GENOTYPES AT TWO LOCI:若A,B是两个独立位点:PA是基因A的概率,PB是基因B的概率.因为基因A与基因B是相互独立的位点, ...

  9. Codeforces 1292A/1293C - NEKO's Maze Game

    题目大意: 有一个2*n的图 NEKO#ΦωΦ要带领mimi们从(1,1)的点走到(2,n)的点 每次会操作一个点,从可以通过到不可以通过,不可以通过到可以通过 每操作一次要回答一次NEKO#ΦωΦ能 ...

  10. bat脚本修改dns(判断系统版本)

    @echo off systeminfo if "%OS 名称%"=="%7%" goto windows7:windows7echo 正在设置本机主DNS , ...