• 算法模板——左偏树(可并堆)


    实现的功能——输入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         
  • 相关阅读:
    用Lua编写ACM算法竞赛开灯问题
    糟糕的中文版龙书
    font and face, 浅探Emacs字体选择机制及部分记录
    栈与卡特兰数
    关于2018年东南大学Robomaster算法组工作的总结
    C++中的默认参数规则
    MySQL第三章——嵌套查询
    MySQL第三章——空值的处理
    MySQL第三章——数据更新
    MySQL第三章——连接查询
  • 原文地址:https://www.cnblogs.com/HansBug/p/4234971.html
Copyright © 2020-2023  润新知