算法模板——左偏树(可并堆)
实现的功能——输入1 x,将x加入小根堆中;输入2,输出最小值并去在堆中除掉
实现原理——左偏树,这里面维护的是一个小根堆,个人认为其还是没有发挥出左偏树的真正威力——其真正威力在于堆与堆之间可以直接合并,而且复杂度仅为O(logN),在零散插入元素时可以采用本程序中一个个加入的方法,但是当有些题目中预处理多个元素时,则建议通过队列进行合并(别忘了堆与堆之间可以直接合并哦~~~),这样子快一点(详见:《左偏树的特点及其应用》By黄源河),代码量嘛,估计是这几棵常用树里面最短的了,都快和最小生成树差不多了,甚至还可以更短
1 var 2 i,j,k,l,m,n,head:longint; 3 a,lef,rig,fix:array[0..100000] of longint; 4 function min(x,y:longint):longint;inline; 5 begin 6 if x<y then min:=x else min:=y; 7 end; 8 function max(x,y:longint):longint;inline; 9 begin 10 if x>y then max:=x else max:=y; 11 end; 12 procedure swap(var x,y:longint);inline; 13 var z:longint; 14 begin 15 z:=x;x:=y;y:=z; 16 end; 17 procedure merge(var x,y:longint); 18 begin 19 if x=0 then swap(x,y); 20 if y=0 then exit; 21 if a[x]>a[y] then swap(x,y); 22 merge(rig[x],y); 23 fix[x]:=min(fix[lef[x]],fix[rig[x]])+1; 24 if fix[lef[x]]<fix[rig[x]] then swap(lef[x],rig[x]); 25 end; 26 function cuthead(var x:longint):longint; 27 var a1:longint; 28 begin 29 a1:=a[x]; 30 merge(lef[x],rig[x]); 31 x:=lef[x]; 32 exit(a1); 33 end; 34 begin 35 readln(n);m:=0;head:=0; 36 for i:=1 to n do 37 begin 38 read(j); 39 case j of 40 1:begin 41 readln(k); 42 inc(m);a[m]:=k;l:=m; 43 merge(head,l); 44 end; 45 2:begin 46 readln; 47 writeln(cuthead(head)); 48 end; 49 end; 50 end; 51 end. 52
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)