[Luogu3377]【模板】左偏树(可并堆)
题面戳我
题目描述
如题,一开始有N个小根堆,每个堆包含且仅包含一个数。接下来需要支持两种操作:
操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除或第x和第y个数在用一个堆内,则无视此操作)
操作2: 2 x 输出第x个数所在的堆最小数,并将其删除(若第x个数已经被删除,则输出-1并无视删除操作)
输入输出格式
输入格式:
第一行包含两个正整数N、M,分别表示一开始小根堆的个数和接下来操作的个数。
第二行包含N个正整数,其中第i个正整数表示第i个小根堆初始时包含且仅包含的数。
接下来M行每行2个或3个正整数,表示一条操作,格式如下:
操作1 : 1 x y
操作2 : 2 x
输出格式:
输出包含若干行整数,分别依次对应每一个操作2所得的结果。
输入输出样例
输入样例#1:
5 5
1 5 4 2 3
1 1 5
1 2 5
2 2
1 4 2
2 2
输出样例#1:
1
2
说明
当堆里有多个最小值时,优先删除原序列的靠前的,否则会影响后续操作1导致WA。
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=10,M<=10
对于70%的数据:N<=1000,M<=1000
对于100%的数据:N<=100000,M<=100000
sol
左偏树模板题,考虑到要讲所以就把陈年代码翻出来写一写题解。
我们考虑到左偏树的一个非常优秀的性质:树高的期望是\(logn\)
所以判断是否在同一个堆中,只要暴力跳堆顶即可。
(其实也是可以写个并查集的啦)
其他就好说了。
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX=100005;
int key[MAX],ls[MAX],rs[MAX],fa[MAX],dis[MAX],del[MAX],n,m;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=-1,ch=getchar();
while (ch>='0'&&ch<='9')
{
x=(x<<3)+(x<<1)+ch-'0';
ch=getchar();
}
return x*w;
}
int Merge(int A,int B)
{
if (!A) return B;
if (!B) return A;
if (key[A]>key[B]||(key[A]==key[B]&&A>B)) swap(A,B);
rs[A]=Merge(rs[A],B);
fa[rs[A]]=A;
if (dis[ls[A]]<dis[rs[A]]) swap(ls[A],rs[A]);
dis[A]=dis[rs[A]]+1;
return A;
}
void Delete(int A)
{
del[A]=1;
fa[ls[A]]=fa[rs[A]]=0;
Merge(ls[A],rs[A]);
}
int find(int x)
{
while (fa[x]) x=fa[x];
return x;
}
int main()
{
n=gi();m=gi();
for (int i=1;i<=n;i++) key[i]=gi();
while (m--)
{
int opt=gi();
if (opt==1)
{
int x=gi(),y=gi();
int fx=find(x),fy=find(y);
if (del[x]||del[y]||fx==fy) continue;
Merge(fx,fy);
}
else
{
int x=gi();
if (del[x]) printf("-1\n");
else
{
int fx=find(x);
printf("%d\n",key[fx]);
Delete(fx);
}
}
}
return 0;
}
[Luogu3377]【模板】左偏树(可并堆)的更多相关文章
- [note]左偏树(可并堆)
左偏树(可并堆)https://www.luogu.org/problemnew/show/P3377 题目描述 一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 ...
- bzoj2809 [Apio2012]dispatching——左偏树(可并堆)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2809 思路有点暴力和贪心,就是 dfs 枚举每个点作为管理者: 当然它的子树中派遣出去的忍者 ...
- [luogu3377][左偏树(可并堆)]
题目链接 思路 左偏树的模板题,参考左偏树学习笔记 对于这道题我是用一个并查集维护出了哪些点是在同一棵树上,也可以直接log的往上跳寻找根节点 代码 #include<cstdio> #i ...
- HDU3031 To Be Or Not To Be 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU3031 题意概括 喜羊羊和灰太狼要比赛. 有R次比赛. 对于每次比赛,首先输入n,m,n表示喜羊羊和灰 ...
- HDU5818 Joint Stacks 左偏树,可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU5818 题意概括 有两个栈,有3种操作. 第一种是往其中一个栈加入一个数: 第二种是取出其中一个栈的顶 ...
- BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始 ...
- Monkey King(左偏树 可并堆)
我们知道如果要我们给一个序列排序,按照某种大小顺序关系,我们很容易想到优先队列,的确很方便,但是优先队列也有解决不了的问题,当题目要求你把两个优先队列合并的时候,这就实现不了了 优先队列只有插入 删除 ...
- 洛谷 P3377 模板左偏树
题目:https://www.luogu.org/problemnew/show/P3377 左偏树的模板题: 加深了我对空 merge 的理解: 结构体的编号就是原序列的位置. 代码如下: #inc ...
- BZOJ 5494: [2019省队联测]春节十二响 (左偏树 可并堆)
题意 略 分析 稍微yy一下可以感觉就是一个不同子树合并堆,然后考场上写了一发左偏树,以为100分美滋滋.然而发现自己傻逼了,两个堆一一对应合并后剩下的一坨直接一次合并进去就行了.然鹅我这个sb把所有 ...
- BZOJ1455 罗马游戏 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1455 题意概括 n个人,2种操作. 一种是合并两个人团,一种是杀死某一个人团的最弱的人. 题解 左 ...
随机推荐
- EL表达式多条件判断方式
<td> <c:forEach items="${cityMap}" var="entry"> <hr> <input ...
- alertifyjs
<%@ page contentType="text/html; charset=UTF-8"%> <!DOCTYPE html PUBLIC "-// ...
- Jenkins代码管理
1.1 Jenkins安装与下载应用代码 应用部署 http://jenkins-ci.org http://wordpress.org/ http://core.svn.wordp ...
- handler机制面试
handler面试必问 解析: Android提供了Handler和Looper来满足线程间的通信. Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(Message E ...
- openresty 中mime.types 文件缺失问题,无法展示图片
看技术群有人问这个:"图片不展示了,直接下载了,怎么设置nginx",之前刚开始学习nginx时遇到过,然后 使用 openresty+lua在做网关时遇到过,这里还是记录下吧. ...
- 将DataSet转化成XML格式的String类型,再转化回来。
/// <summary> /// 获取DataSet的Xml格式 /// </summary> public static string GetDataSetXml(this ...
- Storm日志分析调研及其实时架构
1.Storm第一个Demo 2.Windows下基于eclipse的Storm应用开发与调试 3.Storm实例+mysql数据库保存 4.Storm原理介绍 5. flume+kafka+stor ...
- PCI9054 DMA设置流程
1.设置方式寄存器:设置DMA通道的传输方式,寄存器DMAMODE0或者DMAMODE1的位9:0-表示块传输,1-表示散/聚传输: 2.设置PCI地址寄存器:设置PCI总线侧的地址空间. 3.设置L ...
- 【javascript】jquery jsonp跨越请求
<html> <head> <meta charset="utf-8"> <title></title> <scr ...
- JDBC完成的三个基本工作
JDBC完成的三个基本工作 1.与数据库建立连接 2.执行SQL语句 3.获得SQL语句的执行结果