博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[模板]左偏树
阅读量:5257 次
发布时间:2019-06-14

本文共 1404 字,大约阅读时间需要 4 分钟。

用途

可在log复杂度合并的堆

性质

每个节点有一个距离,具体定义我不知道

1.满足堆的性质

2.左子节点距离>=右子节点

3.节点距离=右子节点距离加1

实现

按照以上的性质实现merge(x,y),先选出x,y中比较大的那个(大根堆为例),再拿它的右儿子和另一个去merge,如果merge出来不符合性质2就swap一下,最后更新自己的距离

于是也能实现pop,就是把根节点的左右孩子merge起来

实现过程中只需要记孩子不需要记父亲,但可以仿照并查集的样子记父亲来做到给一个点查它所属的根

例题

luogu3377

一开始有N个小根堆,每个堆包含且仅包含一个数。接下来需要支持两种操作:

操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除或第x和第y个数在用一个堆内,则无视此操作)

操作2: 2 x 输出第x个数所在的堆最小数,并将其删除(若第x个数已经被删除,则输出-1并无视删除操作)

1 #include
2 #define pa pair
3 #define CLR(a,x) memset(a,x,sizeof(a)) 4 #define MP make_pair 5 using namespace std; 6 typedef long long ll; 7 const int maxn=1e5+10; 8 9 inline char gc(){10 return getchar();11 static const int maxs=1<<16;static char buf[maxs],*p1=buf,*p2=buf;12 return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxs,stdin),p1==p2)?EOF:*p1++;13 }14 inline ll rd(){15 ll x=0;char c=gc();bool neg=0;16 while(c<'0'||c>'9'){
if(c=='-') neg=1;c=gc();}17 while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=gc();18 return neg?(~x+1):x;19 }20 21 int ch[maxn][2],fa[maxn],v[maxn],dis[maxn],N,M;22 23 inline int getf(int x){24 while(fa[x]) x=fa[x];return x;25 }26 27 inline int merge(int x,int y){28 if(!x) return y;29 if(!y) return x;30 if(v[x]>v[y]||(v[x]==v[y]&&x>y)) swap(x,y);31 ch[x][1]=merge(ch[x][1],y);32 fa[ch[x][1]]=x;33 if(dis[ch[x][0]]

 

转载于:https://www.cnblogs.com/Ressed/p/10485765.html

你可能感兴趣的文章
matplotlib 进阶之Tight Layout guide
查看>>
多线程 测试
查看>>
web提前做好测试
查看>>
tp5.1 本地正常, 线上route.php不起作用的问题
查看>>
[笔记] 斯特林公式
查看>>
空指针的解决方案Optional包装类
查看>>
opencv删除轮廓
查看>>
简谈【自动化协议逆向工程技术的当前趋势】
查看>>
Leetcode 127
查看>>
Leetcode 1004. 最大连续1的个数 III
查看>>
OpenJudge1001Exponentiation
查看>>
2018.4.2 看k&r
查看>>
实战分区表:SQL Server 2k5&2k8系列(三)
查看>>
JS简单的倒计时(代码优化)
查看>>
CSS2.0实现面包屑
查看>>
css font的简写规则
查看>>
CSS| 框模型-輪廓
查看>>
kafka报错 Replication factor: 3 larger than available brokers: 0.
查看>>
linux查看和修改PATH环境变量的方法
查看>>
浅谈自定义UITextField的方法
查看>>