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

左偏树有两个重要的性质,

1、树中每个元素小于或大于其父亲节点的值(堆性质)

2、定义节点的距离为当前节点向下到叶子节点最少所需的边数,叶子节点的距离为0,空节点的距离是-1,令dist[i]表示i节点的距离,那么dist[i]=dist[right[i]]+1;dist[left[i]]>=dist[right[i]],所以左偏树的左右子树都是左偏树。

如下图就是一颗左偏树

左偏树最核心操作就是【合并】。删除最大,插入都可由合并得到

假如我们要构造最小堆

Merge(A,B)表示合并A和B

假如A或B中的一个为空返回另一棵树即可

否则,若A根节点小于B的根节点(否则把A和B交换),把A的根作为新的树的根然后Merge(right(A),B)即可

由于Merge过程中性质(2)可能被破坏,那么把左子树和右子树交换重新计算dist即可

C++ Code:

Lheap* merge(Lheap* a,Lheap *b){if(a==NULL)return b;if(b==NULL)return a;if(b->val>a->val)swap(a,b);a->r=merge(a->r,b);if(dis(a->l)<dis(a->r))swap(a->l,a->r);a->dis=dis(a->r)+1;return a;
}

插入操作很简单,把插入的点看做看做一个左偏树,直接Merge即可

删除最小也很简单,先Merge(left(A),right(A)),再删除原来的根就行

查询即为根节点的值

——————————————————————————————————————————————————————————————————————————
题目:HDOJ 1512 Monkey King

题目大意:有N个数字,初始情况,每个数字单独构成一个集合,每次把X,Y所在集合的最大值除以2,然后合并X和Y所在集合,询问新集合的最大值,若XY本身就在同一集合输出-1

做法:并查集+左偏树维护即可

Code C++:

Accepted 1512 1046MS 16180K 1627 B G++
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define MAXN 100001
using namespace std;
struct Lheap{int val,dis;Lheap *l,*r;
};
Lheap* tree[MAXN];
int fa[MAXN];
void init(Lheap* &t,int val){t=new Lheap;t->val=val;t->l=t->r=NULL;t->dis=0;
}
int findset(int x)
{int y,root,t;y=x;while(y!=fa[y])y=fa[y];root=y;y=x;while(fa[y]!=y){t=fa[y];fa[y]=root;y=t;}return root;
}
int Union(int x,int y){int fx=findset(x);int fy=findset(y);if(fx==fy)return -1;fa[fx]=fy;return fy;
}
int dis(Lheap *a){return (a)?(a->dis):(-1);}
Lheap* merge(Lheap* a,Lheap *b){if(a==NULL)return b;if(b==NULL)return a;if(b->val>a->val)swap(a,b);a->r=merge(a->r,b);if(dis(a->l)<dis(a->r))swap(a->l,a->r);a->dis=dis(a->r)+1;return a;
}
Lheap* delmax(Lheap *a){if(!a)return NULL;return merge(a->l,a->r);
}
int solve(int fx,int fy){Lheap *t1,*t2,*t3,*t4;init(t1,tree[fx]->val/2);t3=delmax(tree[fx]);t3=merge(t1,t3);init(t2,tree[fy]->val/2);t4=delmax(tree[fy]);t4=merge(t2,t4);fy=Union(fx,fy);tree[fy]=merge(t3,t4);return tree[fy]->val;
}
int main()
{//freopen("gen.out","r",stdin);int n;while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++){int atk;scanf("%d",&atk);fa[i]=i;init(tree[i],atk);}int que;scanf("%d",&que);while(que--){int x,y;scanf("%d%d",&x,&y);int fx=findset(x),fy=findset(y);if(fx!=fy)printf("%d\n",solve(fx,fy));else printf("-1\n");}for(int i=1;i<=n;i++)delete tree[i];}return 0;
}

可并堆——左偏树 Leftist Heap相关推荐

  1. LuoguP1456 - Monkey King| 左倾堆 | 左偏树

    洛谷P1456 有n只猴子,每只猴子的战斗力为ai.m次操作,每次操作过后,猴子认识的猴子中(包括自己)战斗力最大的战斗力减半.操作后,两只猴子从不认识变为认识.输出打完架之后猴子认识的猴子中的最大战 ...

  2. Monkey King(左偏树 可并堆)

    我们知道如果要我们给一个序列排序,按照某种大小顺序关系,我们很容易想到优先队列,的确很方便,但是优先队列也有解决不了的问题,当题目要求你把两个优先队列合并的时候,这就实现不了了 优先队列只有插入 删除 ...

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

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

  4. 《程序设计解题策略》——1.6 利用左偏树实现优先队列的合并

    本节书摘来自华章计算机<程序设计解题策略>一书中的第1章,第1.6节,作者:吴永辉 王建德 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.6 利用左偏树实 ...

  5. HDU1512 (左偏树)

    2.1.2 可并堆的定义 可并堆(Mergeable Heap)也是一种抽象数据类型,它除了支持优先队列的三个基本操作(Insert, Minimum, Delete-Min),还支持一个额外的操作- ...

  6. 一篇讲左偏树的好文章~

    传送门:http://blog.csdn.net/iaccepted/article/details/6748038 二.左偏树的定义和性质.............................. ...

  7. [2018.12.6]左偏树

    其实NOIp之前就学会了...结果咕到了现在... 我们都知道堆.但是很少有人会手写堆.因为我们有STL,而且手写堆码量不小(据说是吧?没写过). 而且堆的\(Merge\)操作又慢又麻烦. 于是就有 ...

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

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

  9. 可并堆(左高树、左偏树)

    可并堆(左高树.左偏树) 左偏树相对于二叉堆,其插入,弹出,合并的时间复杂度都是对数级别的. 高度优先左偏树(HBLT) 考虑一颗二叉树,将其叶子节点的子节点补全,那么原来有的节点叫做内部节点,新增加 ...

最新文章

  1. 显示-连接-删除管理数据库管理应用
  2. 用蛾子触角当天线,用气味导航!美国博士发明奇特生物技术无人机
  3. UA OPTI570 量子力学33 Time-dependent Perturbation基础
  4. 【题解】Luogu SP1435 PT07X - Vertex Cover
  5. 带有帐号密码验证的apche服务器文件下载
  6. python 判断数据类型,是否与已知相同
  7. mysql主从复制服务器配置
  8. VB中什么是类,类模块有什么作用
  9. 不刷新改变/更换URL: pushState + Ajax
  10. java 学习资料 分享
  11. 弹性碰撞次数与圆周率的关系 - 3Blue1Brown
  12. VEH +硬件断点 HOOK
  13. win10电脑插耳机没反应(win10插上耳机还外放)
  14. 我的世界服务器末地文件在哪,我的世界:找不到末地城怎么办?巧用2个操作,就能瞬间找到!...
  15. vue中下载文件使用file-saver,文件错误excel无法打开
  16. mysql excel 数据处理_将excel的数据进行sql处理
  17. 玩转Kubernetes—尝试以不同方式初始化集群
  18. 电商系统-优惠券部分设计
  19. 请把ios文件解压出来是什么意思_全网电影+美剧+日韩剧(ios+安卓)
  20. 「镁客早报」FF称恒大健康公告内容“部分不属实”;特斯拉实现汽车日产7000辆目标...

热门文章

  1. 十款常用Linux系统介绍
  2. 基于arx模型的MPC预测控制器simulink建模与仿真实现
  3. 一文看懂Lambda
  4. Yii Framework 开发教程Zii组件-Tabs示例
  5. iOS App构建版本
  6. 泰坦尼克号入门学习(思维导图)
  7. 远场(far-field)语音识别的主流技术有哪些
  8. elasticsearch forcemerge
  9. 错误 1 error MSB4062: 未能从程序集 C:\caffe\NugetPackages\OpenCV.2.4.10\buil
  10. 好程序员Java培训分享如何快速入门Java编程