zoukankan      html  css  js  c++  java
  • SCUT

    https://scut.online/p/278
    第一次遇到不需要并查集的左偏树。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    int n,m;
    const int MAXN=1000005;
    int tot,v[MAXN],l[MAXN],r[MAXN],d[MAXN];
    int gc[MAXN];   //gc[i]表示编号为i的工厂所在的左偏树是哪个x
    
    class Leftist_Tree {
        inline int _Merge(int x,int y) {
            if(!x||!y)
                return x+y;
            //<就是大顶堆
            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;
        }
        inline int Build(int val=-1) {
            tot++;
            l[tot]=r[tot]=d[tot]=0;
            v[tot]=val;
            return tot;
        }
      public:
        inline void Init() {
            tot=0;
            v[0]=-1;
            //memset(gc,0,sizeof(gc));多组数据时要把工厂指回空树
        }
        inline void Push(int &x,int &val) {
            //向x工厂加入节点val
            int rt=Build(val);
            gc[x]=_Merge(rt,gc[x]);
        }
        inline int Pop(int &x) {
            //把x工厂的顶端弹出,没有顶端弹出v[0],那个节点还在只不过失联了而已
            int gcx=gc[x];
            gc[x]=_Merge(l[gcx],r[gcx]);
            return v[gcx];
        }
        inline void Merge(int &x,int &y) {
            //把y工厂合并到x工厂
            gc[x]=_Merge(gc[x],gc[y]);
            gc[y]=Build();
        }
    } lt;
    
    inline int read() {
        int x=0;
        char c;
        do {
            c=getchar();
        } while(c<'0'||c>'9');
        do {
            x=(x<<3)+(x<<1)+c-'0';
            c=getchar();
        } while(c>='0'&&c<='9');
        return x;
    }
    
    inline void _write(int x) {
        if(x>9)
            _write(x/10);
        putchar(x%10+'0');
    }
    
    inline void write(int x) {
        if(x<0) {
            putchar('-');
            x=-x;
        }
        _write(x);
        putchar('
    ');
    }
    
    int main() {
    #ifdef Yinku
        freopen("Yinku.in","r",stdin);
    #endif // Yinku
        int n=read(),m=read();
        lt.Init();
        for(int i=1; i<=m; i++) {
            int ins=read();
            switch(ins) {
                case 1: {
                    int x=read(),v=read();
                    lt.Push(x,v);
                    break;
                }
                case 2: {
                    int x=read(),y=read();
                    lt.Merge(x,y);
                    break;
                }
                case 3: {
                    int x=read();
                    //printf("%d
    ",lt.Pop(x));
                    write(lt.Pop(x));
                    break;
                }
            }
        }
    }
    
  • 相关阅读:
    Linux系统下的安装jdk和tomcat教程
    CentOS环境下安装jdk和tomcat
    Java的一个高性能快速深拷贝方法。Cloneable?
    AOP面向切面
    struts中实现ajax的配置信息
    上传下载固定配置
    mysql常用命令
    阿里云部署前后台项目
    PMP相关文件梳理
    面试思路总结
  • 原文地址:https://www.cnblogs.com/Yinku/p/11028289.html
Copyright © 2011-2022 走看看