洞穴勘测——LCT模板

改了4小时,我果然还是太弱了……

#include<bits/stdc++.h>
using namespace std;
const int maxx=1e4+5;
int c[maxx][2],fa[maxx],Rev[maxx];
int get(int x){
    if(c[fa[x]][1]==x)return 1;
    if(c[fa[x]][0]==x)return 0;
    return -1;
}void rot(int x){
 int f=fa[x],ff=fa[f],l=get(x),r=l^1;
    if(get(f)!=-1)c[ff][c[ff][1]==f]=x;
    fa[c[x][r]]=f; fa[f]=x; fa[x]=ff;
    c[f][l]=c[x][r]; c[x][r]=f;
}

void pushdown(int x){
	if(Rev[x]){
		Rev[x]=0;
		swap(c[x][0],c[x][1]);
		Rev[c[x][0]]^=1;
		Rev[c[x][1]]^=1;
	}
}
void cle(int x){if(get(x)!=-1)cle(fa[x]);pushdown(x);}
void splay(int x){
    cle(x);
    for(int f=fa[x];get(x)!=-1;rot(x),f=fa[x])
        if(get(f)!=-1)rot(get(x)==get(f)?f:x);
}
void Access(int x){for(int t=0;x;x=fa[t=x])splay(x),c[x][1]=t;}
int Findroot(int x){//找x结点的根
	Access(x);
	splay(x);
	while(c[x][0]){
		pushdown(x);
		x=c[x][0];
	}
	return x;
}
int Evert(int x){//反转X到根的链
	Access(x);
	splay(x);
	Rev[x]=1;
}
void Cut(int x,int y){
	Evert(x);
	Access(y);
	splay(y);
	fa[x]=c[y][0]=0;
}
void Link(int x,int y){//让x成为y的新儿子 ,注意x是一个根
	Evert(y);
	fa[y]=x;
}
int main(){
	char ch[20];
	int x,y,n,m;
	scanf("%d%d",&n,&m);
	while(m--){
		scanf("%s%d%d",ch,&x,&y);
		if(ch[0]==‘C‘)Link(x,y);
		if(ch[0]==‘D‘)Cut(x,y);
		if(ch[0]==‘Q‘){
			if(Findroot(x)==Findroot(y))printf("Yes\n");
			else printf("No\n");
		}
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/wyb-----520/p/10122623.html

时间: 2024-10-12 03:48:34

洞穴勘测——LCT模板的相关文章

[BZOJ2049] [CodeVS1839] [SDOI2008] Cave 洞穴勘测 (LCT)

Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如两个洞穴可以通过一条或者多条通道按一定顺序连接起来,那么这两个洞穴就是连通的,按顺序连接在一起的这些通道则被称之为这两个洞穴之间的一条路径.洞穴都十分坚固无法破坏,然而通道不太稳定,时常因为外界影响而发生改变,比如,根据有关仪器的监测结果,123号洞穴和127号洞穴之间有时会出现一条通

【SDOI2008】洞穴勘测 - LCT

题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如两个洞穴可以通过一条或者多条通道按一定顺序连接起来,那么这两个洞穴就是连通的,按顺序连接在一起的这些通道则被称之为这两个洞穴之间的一条路径. 洞穴都十分坚固无法破坏,然而通道不太稳定,时常因为外界影响而发生改变,比如,根据有关仪器的监测结果,123号洞穴和127号洞穴之间有时会出现一条通道,有时这

BZOJ 2049([Sdoi2008]Cave 洞穴勘测-LCT)[Template:LCT]

2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 4809  Solved: 2141 [Submit][Status][Discuss] Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如两个洞穴可以通过一条或者多条通道按一定顺序连接

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

题面 传送门:https://www.luogu.org/problemnew/show/P2147 Solution 这题...... 我们可以发现题目要求我们维护一个动态森林,而且只查询连通性.... 显然LCT模板题啊,关于LCT玩法,可以猛戳这里学习 Code #include<iostream> #include<cstdio> #include<vector> using namespace std; long long read() { long long

BZOJ 2049 [Sdoi2008]Cave 洞穴勘测 LCT

题意:链接 方法: LCT 解析: 搞了一下午的LCT,这道题就当做第一道模板?题.然后大概写个理解总结什么的. 首先!splay不要写挂!不要写挂! 然后对于这道题.没有什么奇怪的操作. 只有两个操作,将两个节点连起来,将两个节点之间的连边断开. 每一次询问,询问两个节点是否连通. 听起来挺简单的,一下子就想到了并查集有没有! 然而发现并查集并不可以搞. 也许是我太弱,但是我真的不会并查集的分割. 所以还是老老实实来想LCT. LCT 顾名思义,Link Cut 是其比较有代表性的操作? 首先

bzoj 2049 Cave 洞穴勘测(LCT)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 动态树入门题,不需要维护任何信息. 我用的是splay,下标实现的lct. 1 #include <iostream> 2 #include <sstream> 3 #include <ios> 4 #include <iomanip> 5 #include <functional> 6 #include <algorith

BZOJ2049 SDOI2008 洞穴勘测 LCT

题意:给定一棵树,维护:1.删除一条边  2.添加一条边  3.询问u和v是否连通 题解:LCT维护连通性 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; const int MAXN=10000+2; typedef struct NODE{ NODE *ch

BZOJ2049: [SDOI2008]Cave 洞穴勘测 LCT

第一道LCT. 动态维护集合就好了. LCT就是一群链通过父亲关系练成一颗不太连续的树,通过儿子关系组成实边,在这里没有查找单点一说,都是直接拎起来,对于一条链他对外界的有用反馈就是他的链父亲以及需求点的真实位置,而每次cut的时候就会把标记下方好,每次spaly都会找到这个点在这条链中的真实位置,因此这个玄妙的东西就形成了. null不是一定要用只是简化了你的讨论. 千万别忘了这里的spaly的特别之处!!!!!!!! #include<cstring> #include<cstdio

【BZOJ2049】【SDOI2008】Cave 洞穴勘测 LCT裸题 模版题 数组版

数组,至少目前我只写数组,不写指针. LCT这种东西我不打算讲或者什么乱七八糟的,反正这一篇是自用. 同样,看这篇博客的人可以先去别的地方学LCT,然后来我这扒代码. 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define ls son[x][0] #define rs son[x][1] #define is(x) (x==son[f