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 *child[2],*f;
    bool rev;
} *TREE;
TREE root,Null,mark[MAXN];
int N,M;
char s[10];

TREE NewNode(TREE f){
    TREE x=new NODE;
    x->f=f,x->child[0]=x->child[1]=Null;
    x->rev=0;
    return x;
}

void Initialize(int N){
    Null=NewNode(0);
    for(int i=1;i<=N;i++) mark[i]=NewNode(Null);
}

void Pushdown(TREE &x){
    if(x->f->child[0]==x || x->f->child[1]==x) Pushdown(x->f);
    if(x->rev){
        swap(x->child[0],x->child[1]);
        x->child[0]->rev^=1,x->child[1]->rev^=1;
        x->rev=0;
    }
}

void Rotate(TREE &x,bool t){
    TREE y=x->f;
    y->child[!t]=x->child[t],x->child[t]->f=y,x->f=y->f;
    if(y->f->child[0]==y) y->f->child[0]=x;
    if(y->f->child[1]==y) y->f->child[1]=x;
    x->child[t]=y,y->f=x;
}

void Splay(TREE &x){
    Pushdown(x);

    TREE y=x->f;
    while(y->child[0]==x || y->child[1]==x){
        if(y->child[0]==x){
            if(y->f->child[0]==y) Rotate(y,1);
            Rotate(x,1);
        }
        else{
            if(y->f->child[1]==y) Rotate(y,0);
            Rotate(x,0);
        }
        y=x->f;
    }
}

void Access(TREE &x){
    TREE y=Null,z=x;
    while(z!=Null){
        Splay(z);
        z->child[1]=y;
        y=z,z=z->f;
    }
}

void Move(TREE &x){
    Access(x),Splay(x);
    x->rev^=1,Pushdown(x);
}

void Link(TREE &x,TREE &y){
    Move(x);
    x->child[0]=Null,x->f=y;
}

void Cut(TREE &x,TREE &y){
    Move(x);
    x->child[1]=Null;
    Access(y);
    x->child[1]=Null;
    Splay(y);
    y->f=Null;
}

TREE Query(TREE &x){
    TREE y=x;
    while(y->f!=Null) y=y->f;
    return y;
}

int main(){
    scanf("%d %d",&N,&M);
    Initialize(N);
    for(int i=1,x,y;i<=M;i++){
        scanf("%s %d %d",s,&x,&y);
        if(s[0]==‘Q‘)
            if(Query(mark[x])==Query(mark[y])) puts("Yes");
            else puts("No");
        if(s[0]==‘C‘) Link(mark[x],mark[y]);
        if(s[0]==‘D‘) Cut(mark[x],mark[y]);
    }

    return 0;
}

时间: 2024-08-27 23:08:36

BZOJ2049 SDOI2008 洞穴勘测 LCT的相关文章

BZOJ-2049 [Sdoi2008]洞穴勘测

LCT模版题.... #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cctype> #include <cmath> #define rep(i, l, r) for(int i=l; i<=r; i++) #define clr(x, c) mems

[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

P2147 [SDOI2008]洞穴勘测

题目 P2147 [SDOI2008]洞穴勘测 做法 说实话如果你在看这篇题解的话应该也没有人劝你回去打模板吧 My complete code #include<cstdio> #include<cstring> #include<iostream> #include<string> using namespace std; typedef int LL; const LL maxn=1e6; inline LL Read(){ LL x(0),f(1);

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

Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为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)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如两个洞穴可以通过一条或者多条通道按一定顺序连接

BZOJ2049:[SDOI2008]洞穴勘测——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=2049 https://www.luogu.org/problemnew/show/P2147 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如两个洞穴可以通过一条或者多条通道按一定顺序连接起来,那么这两个洞穴就是连通的,按顺序连接在一起的这些通道则被称之为

【SDOI2008】洞穴勘测 - LCT

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

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