zoukankan      html  css  js  c++  java
  • bzoj2733: [HNOI2012]永无乡

    spaly.

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int maxn = 100000 + 10;
    int n,m,q;
    char op[10];
    
    struct Splay {
        int f[maxn],l[maxn],r[maxn],s[maxn],a[maxn],fa[maxn];
        int root;
        
        int find(int x) {
            return fa[x]==x? x : fa[x]=find(fa[x]);
        }
        
        void update(int x) {
            s[x]=s[l[x]]+s[r[x]]+1;
        }
        
        void lr(int x) {
            int y=f[x];
            r[y]=l[x];
            if(l[x]) f[l[x]]=y;
            f[x]=f[y];
            if(f[y]) {
                if(l[f[y]]==y) l[f[y]]=x;
                else r[f[y]]=x;    
            }
            f[y]=x; l[x]=y;
            update(y); update(x);
        }
        
        void rr(int x) {
            int y=f[x];
            l[y]=r[x];
            if(r[x]) f[r[x]]=y;
            f[x]=f[y];
            if(f[y]) {
                if(l[f[y]]==y) l[f[y]]=x;
                else r[f[y]]=x;
            }
            f[y]=x; r[x]=y;
            update(y); update(x);
        }
        
        void rotate(int x) {
            if(l[f[x]]==x) rr(x);
            else lr(x);    
        }
        
        void splay(int x) {
            while(f[x]) {
                if(!f[f[x]]) rotate(x);
                else if((l[f[x]]==x) == (l[f[f[x]]]==f[x])) rotate(f[x]),rotate(x);
                else rotate(x),rotate(x);
            }
        }
        
        void insert(int x,int y) {
            while(true) {
                if(a[y]<=a[x]) {
                    if(!l[x]) {
                        l[x]=y,f[y]=x;
                        break;    
                    }
                    x=l[x];
                }
                else {
                    if(!r[x]) {
                        r[x]=y,f[y]=x;
                        break;
                    }
                    x=r[x];
                }
            }    
            splay(y);
        }
        
        void merge(int x,int y) {
            if(!y) return;
            merge(x,l[y]);
            merge(x,r[y]);    
            l[y]=r[y]=0; s[y]=1;
            insert(x,y);
        }
        
        void Q(int x,int k) {
            splay(x); 
            if(s[x]<k) {
                printf("-1
    ");
                return;    
            }
            
            while(s[l[x]]+1 != k) {
                //printf("ddd
    ");
                if(s[l[x]]+1>k) x=l[x];
                else {
                    k-=s[l[x]]+1;
                    x=r[x];
                }
            }
            printf("%d
    ",x);
        }
        
        void B(int x,int y) {
            int rx=find(x),ry=find(y);
            
            if(rx!=ry) {
                fa[rx]=ry;    
                splay(x); splay(y);
                if(s[x]<s[y]) swap(x,y);
                merge(x,y);
            }
        }
        
        void init(int n,int m) {
            for(int i=1;i<=n;i++) scanf("%d",&a[i]),fa[i]=i,s[i]=1;
            for(int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),B(u,v);
        }
    } islands;
    
    int main() {
        scanf("%d%d",&n,&m);
        islands.init(n,m);
        scanf("%d",&q);
        for(int i=1,a,b;i<=q;i++) {
            scanf("%s%d%d",op,&a,&b);
            if(op[0]=='Q') islands.Q(a,b);
            else islands.B(a,b);
        }
        return 0;
    }
  • 相关阅读:
    Java实现 LeetCode 767 重构字符串(ASCII的转换)
    Java实现 LeetCode 767 重构字符串(ASCII的转换)
    Java实现 LeetCode 767 重构字符串(ASCII的转换)
    Java实现 LeetCode 766 托普利茨矩阵(暴力)
    Java实现 LeetCode 766 托普利茨矩阵(暴力)
    Java实现 LeetCode 766 托普利茨矩阵(暴力)
    Java实现 LeetCode 765 情侣牵手(并查集 || 暴力)
    219. Contains Duplicate II
    217. Contains Duplicate
    135. Candy
  • 原文地址:https://www.cnblogs.com/invoid/p/5448392.html
Copyright © 2011-2022 走看看