• ZOJ 2334 Monkey King 可并堆左偏树


    ----------

    int n,m;
    
    class LeftistTree{
    private:
        int tot,v[maxn],l[maxn],r[maxn],d[maxn];
    public:
        int merge(int x,int y){
            if (!x) return y;
            if (!y) return x;
            if (v[x]<v[y]) swap(x,y);
            r[x]=merge(r[x],y);
            if (d[l[x]]<d[r[x]]) swap(l[x],r[x]);
            d[x]=d[r[x]]+1;
            return x;
        }
        int newNode(int x){
            tot++;
            v[tot]=x;
            l[tot]=r[tot]=d[tot]=0;
            return tot;
        }
        int insert(int rt,int val){
            return merge(rt,newNode(val));
        }
        int top(int rt){
            return v[rt];
        }
        int pop(int rt){
            return merge(l[rt],r[rt]);
        }
        void clear(){
            tot=0;
        }
    }tr;
    int lp[maxn];
    int pa[maxn];
    void makeset(int n){
        for (int i=0;i<=n;i++) pa[i]=i;
    }
    int findset(int x){
        if (x!=pa[x]) pa[x]=findset(pa[x]);
        return pa[x];
    }
    void unionset(int x,int y){
        x=findset(x);
        y=findset(y);
        if (x!=y){
            pa[x]=y;
            lp[y]=tr.merge(lp[x],lp[y]);
        }
    }
    
    int main(){
        while (~scanf("%d",&n)){
            makeset(n);
            tr.clear();
            for (int i=1;i<=n;i++){
                int v;
                scanf("%d",&v);
                lp[i]=tr.newNode(v);
            }
            scanf("%d",&m);
            for (int i=1;i<=m;i++){
                int l,r;
                scanf("%d%d",&l,&r);
                if (findset(l)==findset(r)) printf("-1
    ");
                else{
                    int newPower,newRoot;
                    newPower=tr.top(lp[findset(l)])/2;
                    newRoot=tr.pop(lp[findset(l)]);
                    lp[findset(l)]=tr.insert(newRoot,newPower);
                    newPower=tr.top(lp[findset(r)])/2;
                    newRoot=tr.pop(lp[findset(r)]);
                    lp[findset(r)]=tr.insert(newRoot,newPower);
                    unionset(l,r);
                    printf("%d
    ",tr.top(lp[findset(l)]));
                }
            }
        }
    	return 0;
    }
    


    ----------

  • 相关阅读:
    [django]自定义标签和过滤器
    [js]js中6种错误处理机制
    [js] Array.slice和类数组转数组
    [js]this和call.call
    [py]python的time和datetime模块获取星期几
    CentOS 普通用户提升root权限
    CentOS ACL
    CentOS 文件隐藏属性
    CentOS 文件特殊权限SUID,SGID,SBIT
    CentOS 用户管理useradd、usermod等
  • 原文地址:https://www.cnblogs.com/cyendra/p/3681536.html
Copyright © 2020-2023  润新知