• HYSBZ 2049 Cave 洞穴勘测


    比较简单的LCT,就一个link,Cut操作(就是HDU那道题中的两个),直接上代码:

    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <cstdio>
    #include <vector>
    #define LL long long
    #define INF 0x3fffffff
    #define FOR(i,x,y)  for(int i = x;i < y;i ++)
    #define IFOR(i,x,y) for(int i = x;i > y;i --)
    #define MAXN 11000
    
    using namespace std;
    
    int n,q;
    
    struct LCT{
        int pre[MAXN],ch[MAXN][2];
        int flip[MAXN];
        bool rt[MAXN];
    
        void Update_Flip(int x){
            if(!x)  return;
            swap(ch[x][0],ch[x][1]);
            flip[x] ^= 1;
        }
    
        void Init(){
            memset(ch,0,sizeof(ch));
            memset(flip,0,sizeof(flip));
            memset(pre,0,sizeof(pre));
            memset(rt,true,sizeof(rt));
        }
    
        void PushUp(int x){
        }
    
        void PushDown(int x){
            if(flip[x]){
                if(ch[x][0])    Update_Flip(ch[x][0]);
                if(ch[x][1])    Update_Flip(ch[x][1]);
                flip[x] = 0;
            }
        }
    
        void Rotate(int x,int kind){
            int y = pre[x];
            PushDown(y);
            PushDown(x);
            ch[y][!kind] = ch[x][kind];
            if(ch[x][kind]) pre[ch[x][kind]] = y;
            if(rt[y]){
                rt[x] = true;
                rt[y] = false;
            }
            else{
                if(ch[pre[y]][1] == y)  ch[pre[y]][1] = x;
                if(ch[pre[y]][0] == y)  ch[pre[y]][0] = x;
            }
            pre[x] = pre[y];
            pre[y] = x;
            ch[x][kind] = y;
            PushUp(y);
        }
    
        void Splay(int x){
            PushDown(x);
            while(!rt[x]){
                int y = pre[x];
                int z = pre[y];
                PushDown(z); PushDown(y); PushDown(x);
                if(rt[y]){
                    Rotate(x,ch[y][0] == x);
                }
                else{
                    int kind = ch[z][0] == y;
                    if(ch[y][kind] == x){
                        Rotate(x,!kind);
                        Rotate(x,kind);
                    }
                    else{
                        Rotate(y,kind);
                        Rotate(x,kind);
                    }
                }
            }
            PushUp(x);
        }
    
        void Access(int x){
            int fa = 0;
            for(;x;x = pre[fa = x]){
                Splay(x);
                rt[ch[x][1]] = true;
                rt[ch[x][1] = fa] = false;
                PushUp(x);
            }
        }
    
        int GetRoot(int x){
            Access(x);
            Splay(x);
            while(ch[x][0]) x = ch[x][0];
            return x;
        }
    
        void MakeRoot(int x){
            Access(x);
            Splay(x);
            Update_Flip(x);
        }
    
        bool Link(int u,int v){
            if(GetRoot(u) == GetRoot(v))    return false;
            MakeRoot(u);
            pre[u] = v;
            Access(u);
            return true;
        }
    
        bool Cut(int u,int v){
            if(u == v || GetRoot(u) != GetRoot(v))    return false;
            MakeRoot(u);
            Access(v);
            Splay(v);
            if(ch[v][0])    pre[ch[v][0]] = pre[v],rt[ch[v][0]] = true;
            pre[v] = 0;
            ch[v][0] = 0;
            PushUp(v);
            return true;
        }
    
        bool Query(int u,int v){
            if(GetRoot(u) == GetRoot(v))    return true;
            return false;
        }
    
    }lct;
    
    int main(){
        //freopen("test.in","r",stdin);
        while(~scanf("%d%d",&n,&q)){
            lct.Init();
            char op[10];
            int u,v;
            FOR(i,0,q){
                scanf("%s%d%d",op,&u,&v);
                if(!strcmp(op,"Connect")){
                    lct.Link(u,v);
                }
                else if(!strcmp(op,"Destroy")){
                    lct.Cut(u,v);
                }
                else{
                    if(lct.Query(u,v)){
                        printf("Yes
    ");
                    }
                    else
                        printf("No
    ");
                }
            }
        }
        return 0;
    }
    


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    RHEL7挂载ISO做本地yum
    服务器虚拟化架构突出优势
    国内公共DNS
    世界上最小的发行版之一Tiny Core
    VMware v12.1.1 专业版以及永久密钥
    Webbench网站压力测试
    Web.xml配置详解之context-param
    SpringMvc自动代理
    SpringMvc aop before
    SpringMvc 面向切面1
  • 原文地址:https://www.cnblogs.com/hqwhqwhq/p/4811879.html
Copyright © 2020-2023  润新知