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