zoukankan      html  css  js  c++  java
  • 数据结构--左偏树(可并堆)

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

    #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;
    }
  • 相关阅读:
    oc获得设备类型
    oc代码规范
    图片下载进度
    Nsdate的各种常用操作
    学习视频
    ios 编码转换 保存文件
    免费代码托管网站
    两年JAVA程序员的面试总结
    Java 性能优化的 45 个细节
    7年Java游戏后端,被淘汰辛酸史
  • 原文地址:https://www.cnblogs.com/stone41123/p/7581266.html
Copyright © 2011-2022 走看看