• 数据结构--左偏树(可并堆)


    模板:可并堆
    可并堆真的很好写!可并堆真的很好写!可并堆真的很好写!
    只有一个合并操作,插入都是用合并实现的,最多再来一个并查集,真的简单到爆好吗。。
    代码:

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int maxn=200001;
    struct Heap{
        int ls,rs,fa,key,dist;
    }h[maxn];
    int merge(int u,int v){
        if(!u||!v)return u+v;
        if(h[u].key>h[v].key||(h[u].key==h[v].key&&u>v))swap(u,v);
        int &ul=h[u].ls;
        int &ur=h[u].rs;
        ur=merge(ur,v);
        h[ur].fa=u;
        if(h[ul].dist<h[ur].dist)swap(ul,ur);
        h[u].dist=h[ur].dist+1;
        return u;
    }
    int find(int x){
        while(h[x].fa!=0)x=h[x].fa;
        return x;
    }
    void erase(int x){
        h[x].key=-1;
        h[h[x].ls].fa=0;
        h[h[x].rs].fa=0;
        merge(h[x].ls,h[x].rs);
    }
    int n,m;
    int main(){
        scanf("%d %d",&n,&m);
        h[0].dist=-1;
        for(int i=1;i<=n;i++){
            scanf("%d",&h[i].key);
        }
        for(int i=1;i<=m;i++){
            int opt;
            scanf("%d",&opt);
            if(opt&1){
                int x,y;
                scanf("%d %d",&x,&y);
                if(h[x].key!=-1&&h[y].key!=-1){
                    int p=find(x);
                    int q=find(y);
                    if(p!=q)merge(p,q);
                }
            }
            else{
                int x;
                scanf("%d",&x);
                if(h[x].key==-1){
                    printf("-1
    ");
                    continue;
                }
                int fa=find(x);
                printf("%d
    ",h[fa].key);
                erase(fa);
            }
        }
        return 0;
    }
  • 相关阅读:
    三路快排
    双路快排
    随机快排
    快速排序
    双向链表
    单向链表
    堆排序
    二分插入、bisect
    jmockit使用总结-MockUp重点介绍
    java拼接字符串、格式化字符串方式
  • 原文地址:https://www.cnblogs.com/stone41123/p/7581266.html
Copyright © 2020-2023  润新知