[bzoj2049][Sdoi2008]Cave 洞穴勘测_LCT

Cave 洞穴勘测 bzoj-2049 Sdoi-2008

题目大意:维护一个数据结构,支持森林中加边,删边,求两点连通性。n个点,m个操作。

注释:$1\le n\le 10^4$,$1\le m\le 2\cdot 10^5$。

想法:刚学了一发LCT,写一道照学长抄一道板子题。话说什么是LCT?

就是一个贼nb的数据结构,支持加边删边后的什么路径和子树信息啥的,这就是LCT。

艾欧欸软可以的blog

这道题,我们只需要其中的link,cut和find即可。

最后,附上代码.. ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 10050
#define ls ch[p][0]
#define rs ch[p][1]
#define get(x) (ch[f[x]][1]==x)
using namespace std;
int root[N],ch[N][2],n,m,rev[N],f[N];
char opt[10];
inline bool isroot(int p)
{
    return ch[f[p]][0]!=p&&ch[f[p]][1]!=p;
}
inline void pushdown(int p)
{
    if(!rev[p])
	swap(ch[ls][0],ch[ls][1]);
	swap(ch[rs][0],ch[rs][1]);
	rev[ls]^=1;
	rev[rs]^=1;
	rev[p]=0;
}
void update(int p)
{
    if(!isroot(p)) update(f[p]);
    pushdown(p);
}
void rotate(int x)
{
    int y=f[x],z=f[y],k=get(x);
    if(!isroot(y)) ch[z][ch[z][1]==y]=x;
    ch[y][k]=ch[x][!k]; f[ch[y][k]]=y;
    ch[x][!k]=y; f[y]=x; f[x]=z;
}
void splay(int x)
{
    update(x);
    for(int fa;fa=f[x],!isroot(x);rotate(x))
	{
        if(!isroot(fa))
		{
            rotate(get(fa)==get(x)?fa:x);
        }
    }
}
void access(int p)
{
    int t=0;
    while(p) splay(p),rs=t,t=p,p=f[p];
}
void makeroot(int p)
{
    access(p); splay(p);
    swap(ls,rs); rev[p]^=1;
}
void link(int x,int p)
{
    makeroot(x); f[x]=p;
}
void cut(int x,int p)
{
    makeroot(x); access(p); splay(p); ls=f[x]=0;
}
int find(int p)
{
    access(p); splay(p);
    while(ls) pushdown(p),p=ls;
    return p;
}
int main()
{
    scanf("%d%d",&n,&m);
    int x,y;
    for(int i=1;i<=m;i++)
	{
        scanf("%s%d%d",opt,&x,&y);
        if(opt[0]==‘C‘) link(x,y);
        else if(opt[0]==‘D‘) cut(x,y);
        else
		{
            int t=find(x),b=find(y);
            puts(t==b?"Yes":"No");
        }
    }
}

小结:都说LCT出来就是板子题,但是得会敲才行啊???!!

原文地址:https://www.cnblogs.com/ShuraK/p/9278737.html

时间: 2024-10-13 00:15:06

[bzoj2049][Sdoi2008]Cave 洞穴勘测_LCT的相关文章

【LCT】BZOJ2049 [SDOI2008]Cave 洞穴勘测

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

BZOJ_2049_[Sdoi2008]Cave 洞穴勘测_LCT

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

bzoj2049: [Sdoi2008]Cave 洞穴勘测

[题意] 给你一个森林,要求支持动态加边删边,并会询问在某一个时刻两点是否联通. [题解] 裸的lct,模版题.第一次写对lct,没写过真的难写.... [代码] 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 using namespace std; 5 const int N=10005; 6 int n,Q,x,y; 7 int c[N][2],fa[N],rev[N],a[N]

bzoj2049 [Sdoi2008]Cave 洞穴勘测 link cut tree入门

link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isroot(int x):判断x是否为所在重链(splay)的根 void down(int x):下放各种标记 void rotate(int x):在x所在重链(splay)中将x旋转到fa[x]的位置上 void splay(int x):在x坐在重链(splay)中将x旋转到根 void acce

BZOJ2049: [SDOI2008]Cave 洞穴勘测 LCT

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

bzoj2049: [Sdoi2008]Cave 洞穴勘测 lct裸题

题意:三种操作一种摧毁一条边,一种链接一条边,一种查询两个点是否联通 题解:lct的link和cut即可 /************************************************************** Problem: 2049 User: walfy Language: C++ Result: Accepted Time:1896 ms Memory:1508 kb ************************************************

【bzoj2049】[Sdoi2008]Cave 洞穴勘测 link-cut-tree

2016-05-30  11:04:51 学习了link-cut-tree 二中神犇封禹的讲义感觉讲的超级清晰易懂啊(没有的可以q窝 算是模板吧 #include<bits/stdc++.h> #define N 10005 #define inf 1000000000 #define ll long long using namespace std; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){

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)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如两个洞穴可以通过一条或者多条通道按一定顺序连接

BZOJ 题目2049: [Sdoi2008]Cave 洞穴勘测(link cut tree)

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