数据结构--左偏树(可并堆)
来源:互联网 发布:海森矩阵的作用 编辑:程序博客网 时间: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;}
阅读全文
0 0
- 数据结构--左偏树(可并堆)
- 左偏树(可并堆)
- 可并堆?左偏树?
- 左偏树/斜堆/可并堆-洛谷P3377 【模板】左偏树(可并堆)
- hdu1512 左偏树(可并堆)
- 可并堆(左偏树)简单学习
- luoguP3377 【模板】左偏树(可并堆)
- 左偏树(可并堆)模板
- 斜堆——【模板】左偏树(可并堆)
- HDU1512 左偏树(可并堆)
- 可并堆之左偏树
- 【左偏树(可并堆)模板】
- hdu 1512 Monkey King (左偏树 可并堆)
- bzoj1455 罗马游戏(可并堆-左偏树)
- 【洛谷P3377】【模板】左偏树(可并堆)
- 【洛谷】3377【模板】左偏树(可并堆)
- BZOJ 1455 可并堆(左偏树) 解题报告
- HDU 1512 可并堆(左偏树) 解题报告
- 启动Tomcat失败,错误提示:the JRE_HOME environment variable is not defined correctly
- java String方法摘要详解
- redis expire key 过期不删除
- writing-mode属性
- 宏定义求数组元素个数
- 数据结构--左偏树(可并堆)
- 关于C语言中的内存覆盖问题分析
- SingletonBeanRegistry
- 【windows】【编译器版本查】教你查看VS IDE中编译器版本号
- STL常用容器用法之——Map和multimap
- 爬取智联招聘(面向对象)
- 对数学建模论文的一些建议
- relative 和absolute
- springboot整合Mybatis