1、题目大意:就是一个动态维护森林联通性的题

2、分析:lct模板题

#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
#define eps 1e-7
int n, m;
namespace LinkCutTree{
    struct Node{
        Node *ch[2], *fa;
        bool rev;
        Node(){
            ch[0] = ch[1] = NULL;
            fa = NULL;
            rev = false;
        } 

        inline int which(){
            if(fa == NULL || (fa -> ch[0] != this && fa -> ch[1] != this)) return -1;
            return fa -> ch[1] == this;
        }

        inline bool reverse(){
            if(this) rev ^= 1;
        }

        inline void pd(){
            if(rev){
                swap(ch[0], ch[1]);
                if(ch[0] != NULL) ch[0] -> reverse();
                if(ch[1] != NULL) ch[1] -> reverse();
                rev = false;
            }
        }
    } ft[10010], *pos[10010];

    inline void rotate(Node *o){
        Node *p = o -> fa;
        int l = o -> which(), r = l ^ 1;
        o -> fa = p -> fa;
        if(p -> which() != -1) p -> fa -> ch[p -> which()] = o;
        p -> ch[l] = o -> ch[r];
        if(o -> ch[r]) o -> ch[r] -> fa = p;
        o -> ch[r] = p; p -> fa = o;
    } 

    inline void splay(Node* o){
        static stack<Node*> st;
        if(!o) return;
        Node* p = o;
        while(1){
            st.push(p);
            if(p -> which() == -1) break;
            p = p -> fa;
        }
        while(!st.empty()){
            st.top() -> pd(); st.pop();
        }

        while(o -> which() != -1){
            p = o -> fa;
            if(p -> which() != -1){
                if(p -> which() ^ o -> which()) rotate(o);
                else rotate(p);
            }
            rotate(o);
        }
    }

    inline void Access(Node* o){
        Node* p = NULL;
        while(o != NULL){
            splay(o);
            o -> ch[1] = p;
            p = o; o = o -> fa;
        }
    }

    inline void MovetoRoot(Node* o){
        Access(o);
        splay(o);
        o -> reverse();
    }

    inline Node* FindRoot(Node* o){
        while(o -> fa != NULL){
            o = o -> fa;
        }
        return o;
    } 

    inline void Link(Node* x, Node* y){
        MovetoRoot(x);
        x -> fa = y;
    }

    inline void Cut(Node* x, Node* y){
        MovetoRoot(x);
        Access(y);
        splay(y);
        x -> fa = NULL;
        y -> ch[0] = NULL;
    }

    inline void init(){
        for(int i = 1; i <= n; i ++) pos[i] = &ft[i];
    }

    inline void Connect(int u, int v){
        Link(pos[u], pos[v]);
    }

    inline void Destroy(int u, int v){
        Cut(pos[u], pos[v]);
    }

    inline bool Query(int u, int v){
        return FindRoot(pos[u]) == FindRoot(pos[v]);
    }
}

int main(){
    char op[10];
    int u, v;
    scanf("%d%d", &n, &m);
    LinkCutTree::init();
    for(int i = 1; i <= m; i ++){
        scanf("%s", op);
        scanf("%d%d", &u, &v);
        if(op[0] == 'C') LinkCutTree::Connect(u, v);
        else if(op[0] == 'D') LinkCutTree::Destroy(u, v);
        else puts(LinkCutTree::Query(u, v) ? "Yes" : "No");
    }
    return 0;
}

BZOJ2049——[Sdoi2008]Cave 洞穴勘测的更多相关文章

  1. BZOJ2049 SDOI2008 Cave 洞穴勘测 【LCT】

    BZOJ2049 SDOI2008 Cave 洞穴勘测 Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分 ...

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

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

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

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

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

    Cave 洞穴勘测 bzoj-2049 Sdoi-2008 题目大意:维护一个数据结构,支持森林中加边,删边,求两点连通性.n个点,m个操作. 注释:$1\le n\le 10^4$,$1\le m\ ...

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

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

  6. BZOJ2049: [Sdoi2008]Cave 洞穴勘测 Link-Cut-Tree 模板题

    传送门 搞了这么长时间Splay终于可以搞LCT了,等等,什么是LCT? $LCT$就是$Link-Cut-Tree$,是维护动态树的一个很高效的数据结构,每次修改和查询的均摊复杂度为$O(logN) ...

  7. bzoj2049: [Sdoi2008]Cave 洞穴勘测

    lct入门题? 得换根了吧TAT 这大概不是很成熟的版本.. #include<iostream> #include<cstring> #include<cstdlib& ...

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

    link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isro ...

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

    题意:三种操作一种摧毁一条边,一种链接一条边,一种查询两个点是否联通 题解:lct的link和cut即可 /********************************************** ...

随机推荐

  1. C#中使用代码动态改变配置文件信息

    static void Main(string[] args) { XmlDocument xDoc = new XmlDocument(); xDoc.Load("../../App.co ...

  2. winform 窗体传值

    在Form1中:我们要把一个文本传递给Form2窗体,假定为passText               public string passText               {          ...

  3. c# 操作datatable

    1.创建 datatable DataTable dt=new Datable();// 可以给表创建一个名字,tb 2.给表加个列名: dt.Columns.Add("id", ...

  4. 自然语言15.1_Part of Speech Tagging 词性标注

    QQ:231469242 欢迎喜欢nltk朋友交流 https://en.wikipedia.org/wiki/Part-of-speech_tagging In corpus linguistics ...

  5. 10月14日上午PHP环境搭建

    第一步:安装wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b文件,安装过程中可能会遇到问题,把遇到的问题代码复制粘贴到360人工服务,查找方案 ...

  6. MySQL外键使用需要注意的几点

    最近刚刚接触MySQL,在建立表示遇到了一些问题,总是提示错误代码:150 can't create table ...,所以就到网上搜索了一下发现还有以下几点需要注意的: [CONSTRAINT [ ...

  7. winSocket数据传输

    服务器端: #include <WINSOCK2.H> #include <stdio.h> #pragma comment(lib,"ws2_32.lib" ...

  8. 移动端a标签点击图片有阴影处理

    移动端我们在点击页面中的一些图片的时候会出现阴影.处理方法只要给a标签加上 a { -webkit-tap-highlight-color: transparent; -webkit-touch-ca ...

  9. ecshop 订单-》订单状态 2

    // 判断订单状态 public function get_order_status($os,$ps,$ss){ $arr = array('已取消','待付款','待发货','待收货','确认收货' ...

  10. 安卓apk与swiper文字版滚动条

    浏览器基础端代码 <!-- Swiper --> <div class="swiper-container"> <div class="sw ...