玩的有点多。。。。。。睡的有点少。。。

左偏树是一种支持O(logn)的时间复杂度内进行合并的堆式数据结构。

定义:

外结点:左儿子或者右儿子是空结点的结点

距离:一个结点x的距离disx定义为其子树中与结点x最近的外结点到x的距离,特别的,定义空结点的距离为-1.

图中:

结点中写的数字为结点的键值, 结点外的蓝色数字叫做该结点的距离

左偏树依旧满足堆的性质(小根堆)

左偏树保证结点的左子结点的距离不小于右子结点的距离,所以可以推出一个结点的距离等于右子结点的距离+1

合并操作:

在合并的过程中,我们要维护好左偏树的性质,只要合并好后的堆依然满足左偏树的性质,那么合并即告成功

具体步骤:

  1. 设要合并的两个堆的堆顶结点为x, y,且x.val <= y.val

  2. 因为小根性质,合并好后的堆的堆顶一定还是x,所以我们递归合并x的儿子(一般用右)和y

  3. 因为合并完成后可能会破环x的左偏性质,所以如果x不满足左偏性质了,那就交换x的左右儿子

  4. 并且x的距离也有可能随之变化,利用性质3,令x结点的距离等于其右儿子的距离+1

插入给定值:

新建一个值等于插入值的结点,将该结点与左偏树合并即可。时间复杂度O(logn)

求最小值:

由于左偏树的性质,最小值即为根结点的值

删除最小值:

等价于删除左偏树的根节点。合并左右儿子即可,并且维护已删除结点的信息

给定一个结点,求其所在左偏树的根节点:

可以记录每个结点的父亲结点,然后暴力找根结点

【洛谷模板题P3377】https://www.luogu.com.cn/problem/P3377

//用了某大佬的代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
struct node{int l, r, fa; //l,r分别为左右儿子的编号,fa为并查集int val, dis; //val为结点键值, val == -1 代表结点已被删除,dis为结点的距离
}ltt[maxn];
#define ls(x) ltt[x].l
#define rs(x) ltt[x].r
int merge(int x, int y){ //合并两堆,x,y都是堆顶元素编号if(!x || !y) return x + y; //如果有空返回另一个//||前语句是为了维护小根堆性质,后面语句是题目要求if(ltt[x].val > ltt[y].val || (ltt[x].val == ltt[y].val && x > y))std::swap(x, y);rs(x) = merge(rs(x), y);//合并右子树和yltt[rs(x)].fa = x;      //维护并查集if(ltt[ls(x)].dis < ltt[rs(x)].dis) swap(ls(x), rs(x));//如果不满足左偏树的性质就交换左右儿子ltt[x].dis = ltt[rs(x)].dis + 1; // 利用结点距离等于儿子加一来更新disreturn x; //return合并好的堆顶结点编号
}
inline void pop(int x){ //删除堆顶操作ltt[x].val = -1;//值设置为-1即为删除ltt[ls(x)].fa = ls(x);//维护并查集(一个结点的父亲是结点本身,代表结点没有父亲了)ltt[rs(x)].fa = rs(x);//维护并查集//因为路径压缩,所以可能右除了ls(x), rs(x)以外的结点的fa指针指向x//所以这样写为了不让并查集断掉ltt[x].fa = merge(ls(x), rs(x));}
int find(int x){return ltt[x].fa == x ? x : ltt[x].fa = find(ltt[x].fa);
}
int main(){int n, m;cin >> n >> m;ltt[0].dis = -1;for(int i = 1; i <= n; i++){cin >> ltt[i].val;ltt[i].fa = i; // 初始化并查集}while(m--){int opt, x, y;cin >> opt >> x;if(opt == 1){cin >> y;if(ltt[x].val == -1 || ltt[y].val == -1) continue;int fx = find(x), fy = find(y);if(fx == fy) continue;ltt[fx].fa = ltt[fy].fa = merge(fx, fy);}else{if(ltt[x].val == -1) cout << -1 << "\n";else{int fx = find(x);cout << ltt[fx].val << "\n";pop(fx);}}}
}

左偏树初步学习 洛谷P3377相关推荐

  1. 【洛谷3377】 左偏树(可并堆)

    前言 其实我是不小心翻线性基的时候看见的. Solution 左偏树只会模板,挖坑待补 代码实现 #include<stdio.h> #include<stdlib.h> #i ...

  2. 洛谷P3273 [SCOI2011] 棘手的操作 [左偏树]

    题目传送门 棘手的操作 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 ...

  3. 洛谷P4971:断罪者(左偏树)

    解析 看起来就是左偏树的基本操作啊- 然而就是调不过去 吐了qwq 参考了望月大神的实现 感觉清晰的多 就定义并查集维护的是每个点所在的堆的根节点 一下子少了很多恶心的套娃 代码 #include&l ...

  4. 左偏树(可并堆)初步及其应用

    作者:hsez_yyh 链接:左偏树(可并堆)初步及其应用_hsez_yyh的博客-CSDN博客 来源:湖北省黄石二中信息竞赛组        著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  5. 【学习笔记】浅谈短小可爱的左偏树(可并堆)

    文章目录 左偏树 左偏树的合并(merge)操作 例题 罗马游戏 [Apio2012]dispatching [JLOI2015]城池攻占 [Baltic2004]sequence 左偏树 左偏树是一 ...

  6. 【BZOJ】1455 罗马游戏 左偏树

    题目传送门 这题和洛谷上的左偏树模板的解题思路是一模一样的,所以只要贴上左偏树的模板就好了. 附上AC代码: #include <cstdio> #include <cctype&g ...

  7. P3377-[模板]左偏树(可并堆)

    正题 题目链接:https://www.luogu.com.cn/problem/P3377 题目大意 开始时nnn个只有一个数的集合,要求支持 合并两个集合 查询一个集合中的最小值并删除 解题思路 ...

  8. 【左偏树】【P3261】 [JLOI2015]城池攻占

    Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其 ...

  9. 可并堆——左偏树 Leftist Heap

    今天学习了左偏树,这是一个好理解而且好写的数据结构,和二叉堆一样可以在O(1)时间内取出优先级最高的值,O(logn)时间内删除优先级最高的值,不同的是如果要合并两个堆那么二叉堆就只能跪了.而左偏树能 ...

最新文章

  1. 解决了一个遗留的Portlet奇怪问题
  2. html入门学习(一)
  3. QT的QSplitterHandle类的使用
  4. [译] 虚拟现实是如何改变用户体验的:从原型到设备的设计
  5. 数学狂想曲(七)——莱洛三角形
  6. 什么是 Native、Web App、Hybrid、React Native和Weex?
  7. 搭建你的持续集成server - CruiseControl step by step(1)
  8. linux lnmp1.5.tar.gz,Linux 下lnmp
  9. base64解密后乱码_php实现php代码的加密解密
  10. 嵌入式linux地图,基于嵌入式Linux的MapInfo格式地图显示
  11. 网易云部分 解析歌词
  12. 资深程序员推荐七大JavaScript编程工具
  13. 如何用UE4制作2D游戏文档(五)——战斗篇
  14. nanomsg下载、安装、测试
  15. 关于人性论视角下网络虚拟社会的伦理思考
  16. mysql查询手机号隐藏中间四位
  17. ceph rbd mysql_怎样配置ceph rbd存储类型?
  18. 基于PyTorch的C++API运行模型进行图像分类
  19. socket事例代码
  20. 6.22(js-->案例应用)

热门文章

  1. 域名可以用多久_域名保护期限是多久?过期了域名还能用吗
  2. 腾讯云服务器php设置,Windows 腾讯云服务器的 PHP 配置
  3. excel表格两个表格合并
  4. 浅谈研究生对科研工作的那些认知误区
  5. linux系统没ip,树莓派在没有显示器情况下查找未知IP教程
  6. 如何在Axure中使用Iconfont图标字体
  7. TCP/IP英文缩写汇总
  8. 从AdventureWorks学习数据库建模——国际化
  9. Vue单向绑定与双向绑定解析
  10. python将视频像素抓取替换导出mosaic效果的文本视频