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

来源:互联网 发布:海森矩阵的作用 编辑:程序博客网 时间:2024/06/04 19:23

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

#include<bits/stdc++.h>#define ll long longusing 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\n");                continue;            }            int fa=find(x);            printf("%d\n",h[fa].key);            erase(fa);        }    }    return 0;}
原创粉丝点击