zoukankan      html  css  js  c++  java
  • bzoj2049: [Sdoi2008]Cave 洞穴勘测

    这道题是裸的lct(link-cut-tree) 觉得自己讲的不是很好 推荐个博客吧

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int M=10007;
    int read(){
        int ans=0,f=1,c=getchar();
        while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
        return ans*f;
    }
    int n,m;
    int c[M][2],fa[M],rev[M];
    bool isrt(int x){return c[fa[x]][0]!=x&&c[fa[x]][1]!=x;}
    void revs(int x){
        if(!x) return ;
        rev[x]^=1; swap(c[x][0],c[x][1]);
    }
    void down(int x){
        if(!rev[x]) return ; rev[x]=0;
        revs(c[x][0]); revs(c[x][1]);
    }
    void rotate(int x){
        int y=fa[x],z=fa[y],l=0,r=1;
        if(c[y][1]==x) l=1,r=0;
        if(!isrt(y)){
            if(c[z][0]==y) c[z][0]=x;
            else c[z][1]=x;
        }
        fa[x]=z; fa[y]=x; fa[c[x][r]]=y;
        c[y][l]=c[x][r]; c[x][r]=y;
    }
    int st[M],top;
    void splay(int x){
        if(!x) return ;
        st[++top]=x;for(int i=x;!isrt(i);i=fa[i]) st[++top]=fa[i];
        while(top) down(st[top--]);
        while(!isrt(x)){
            int y=fa[x],z=fa[y];
            if(!isrt(y)){
                if(c[z][0]==y^c[y][0]==x) rotate(x);
                else rotate(y);
            }
            rotate(x);     
        }
    }
    void acs(int x){
        int y=x,t=0;
        while(x){
            splay(x);
            c[x][1]=t;
            t=x; x=fa[x];
        }
        splay(y);
    }
    void mrt(int x){acs(x);  revs(x);}
    void link(int x,int y){mrt(x); fa[x]=y;}
    void cut(int x,int y){mrt(x); acs(y); c[y][0]=fa[x]=0;}
    int find(int x){
        while(c[x][0]) down(x),x=c[x][0];
        splay(x);
        return x;
    }
    void push_ans(int x,int y){
        mrt(x); acs(y);
        if(find(y)==x) printf("Yes
    ");
        else printf("No
    ");
    }
    int main()
    {
        char ch[15];
        int x,y;
        n=read(); m=read();
        for(int i=1;i<=m;i++){
            scanf("%s",ch); x=read(); y=read();
            if(ch[0]=='C') link(x,y);
            else if(ch[0]=='D') cut(x,y);
            else push_ans(x,y);
    //      for(int i=1;i<=n;++i)printf("%d %d(%d,%d) %d
    ",i,fa[i],c[i][0],c[i][1],rev[i]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    分析WordPress数据表之用户表(功能篇)
    Android.mk简介:
    win10 mars xlog编译
    sudo apt-get install libstdc++6
    WebRTC 入门教程(二)| WebRTC信令控制与STUN/TURN服务器搭建
    Mars Android 接入指南
    Mars Sample 使用说明
    RxJava2 方法总结
    mqtt client api: 阻塞API
    idea使用git进行项目管理
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/6992426.html
Copyright © 2011-2022 走看看