题目:https://www.luogu.org/problemnew/show/P3377

左偏树的模板题;

加深了我对空 merge 的理解;

结构体的编号就是原序列的位置。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const maxn=1e5+;
int n,m,rt[maxn],fa[maxn];
bool out[maxn];
struct N{
int ls,rs,val,dis;
}t[maxn];
int get(int x){while(rt[x])x=rt[x]; return x;}
int merge(int x,int y)
{
if(!x||!y)return x+y;
if(t[x].val>t[y].val||(t[x].val==t[y].val&&x>y))swap(x,y);
t[x].rs=merge(t[x].rs,y);
if(t[t[x].ls].dis<t[t[x].rs].dis)swap(t[x].ls,t[x].rs);
if(t[x].rs)t[x].dis=t[t[x].rs].dis+;
else t[x].dis=;
rt[t[x].ls]=rt[t[x].rs]=x;
return x;
}
void del(int x)
{
out[x]=;
rt[t[x].ls]=rt[t[x].rs]=;
merge(t[x].ls,t[x].rs);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=,x;i<=n;i++){scanf("%d",&x); t[i].val=x;}
for(int i=,op,x,y,u,v;i<=m;i++)
{
scanf("%d%d",&op,&x);
if(op==)
{
scanf("%d",&y);
if(out[x]||out[y])continue;
u=get(x); v=get(y);
if(u==v)continue;
merge(u,v);
}
else
{
if(out[x]){printf("-1\n"); continue;}
u=get(x); printf("%d\n",t[u].val);
del(u);
}
}
return ;
}

最新文章

  1. [已解决]Teamviewer VPN 连接上,但无法ping
  2. logback配置详解4-实例配置
  3. hdfs的读写数据流
  4. 《Java4Android》视频学习笔记——为什么用抽象类?
  5. 转:如何在32位程序中突破地址空间4G的限制
  6. mongoDB windows安装
  7. Mongodb 安装 以及 问题解决-摘自网络
  8. Adroid解析json
  9. 45种Javascript技巧大全
  10. UE4的编程C++创建一个FPSproject(两)角色网格、动画、HUD、子弹类
  11. SVN.服务器迁移方法
  12. BZOJ 1119: [POI2009]SLO [置换群]
  13. .NET MVC 简单的插件式开发
  14. jq冲刺
  15. springboot整合jsp
  16. 利用jTessBoxEditor工具进行Tesseract-OCR样本训练
  17. securecrt通过ssh连接板子: 密钥交换失败,没有兼容的加密程序
  18. dubbo系列二:dubbo常用功能总结
  19. 数据库中的null用法
  20. window JNI_CreateJavaVM启动java程序

热门文章

  1. Python isalpha() 方法检测字符串是否只由字母组成。
  2. vue启动
  3. spark学习(1)---dataframe操作大全
  4. thymeleaf的使用及配置
  5. 03匿名内部类、eclipse快捷键、String相关知识
  6. 如何用纯 CSS 创作一个按钮文字滑动特效
  7. Python生成随机不重复姓名昵称
  8. POJ 1811 大整数素数判断 Miller_Rabin
  9. sdibt 1244类似于拓扑排序
  10. [USACO07OCT]障碍路线Obstacle Course