洛谷P3377 左偏树
来源:互联网 发布:java后端游戏引擎 编辑:程序博客网 时间:2024/06/06 01:21
参考:https://www.luogu.org/wiki/show?name=%E9%A2%98%E8%A7%A3+P3377
题目描述如题,一开始有N个小根堆,每个堆包含且仅包含一个数。接下来需要支持两种操作:操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除或第x和第y个数在用一个堆内,则无视此操作)操作2: 2 x 输出第x个数所在的堆最小数,并将其删除(若第x个数已经被删除,则输出-1并无视删除操作)
#include <cstdio>#define N 100010using namespace std;int inline read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}void swap(int &x,int &y){int t=x;x=y,y=t;}int ch[N][2],val[N],dis[N],f[N],n,m;int merge(int x,int y){ if (x==0 || y==0) return x+y; if (val[x]>val[y] || (val[x]==val[y] && x>y)) swap(x,y); ch[x][1]=merge(ch[x][1],y); f[ch[x][1]]=x; if (dis[ch[x][0]]<dis[ch[x][1]]) swap(ch[x][0],ch[x][1]); dis[x]=dis[ch[x][1]]+1; return x;}int getf(int x){ while(f[x]) x=f[x]; return x;}void pop(int x){ val[x]=-1; f[ch[x][0]]=f[ch[x][1]]=0; merge(ch[x][0],ch[x][1]);}main(){ n=read(),m=read(); dis[0]=-1; for (int i=1;i<=n;i++) val[i]=read(); for (int i=1;i<=m;i++) { int com=read(); if (com==1) { int x=read(),y=read(); if (val[x]==-1 || val[y]==-1) continue; if (x==y) continue; int fx=getf(x),fy=getf(y); merge(fx,fy); } else { int x=read(); if (val[x]==-1) puts("-1"); else { int y=getf(x); printf("%d\n",val[y]); pop(y); } } }}
阅读全文
0 0
- 洛谷P3377 左偏树
- 左偏树简介(洛谷P3377题解)
- 【洛谷P3377】【模板】左偏树(可并堆)
- 左偏树/斜堆/可并堆-洛谷P3377 【模板】左偏树(可并堆)
- 【模板】左偏树 (模板题:洛谷P3377左偏树/可并堆)
- 洛谷3377【【模板】左偏树】--左偏树&并查集
- 左偏树
- 左偏树
- 左偏树
- 左偏树
- 左偏树
- 左偏树
- 左偏树
- 左偏树
- 左偏树
- 左偏树
- 左偏树
- 左偏树
- 121. Best Time to Buy and Sell Stock
- 【主席树】51Nod 1175 区间中第K大的数
- oracle学习(使用了PL/SQL)——2
- easyui前言
- ios 视频选择封面功能
- 洛谷P3377 左偏树
- 一道闭包题目的做题笔记
- Kotlin控制台输入
- 学习phantomjs(一)(phantomjs关于页面跳转的问题)
- mon选举流程总结
- springMVC
- 堆排序
- android上使用poi操作excel
- jq生成二维码