zoukankan      html  css  js  c++  java
  • bzoj2733

    好久没写treap,稍微练练
    treap的启发式合并

      1 const key=2000007;
      2 var son:array[0..100010,1..2] of longint;
      3     root,a,b,fa,count,f:array[0..100010] of longint;
      4     j,n,m,k,x,y,i:longint;
      5     ch:char;
      6 
      7 function getf(x:longint):longint;
      8   begin
      9     if f[x]<>x then f[x]:=getf(f[x]);
     10     exit(f[x]);
     11   end;
     12 
     13 procedure update(x:longint);
     14   begin
     15     count[x]:=count[son[x,1]]+count[son[x,2]]+1;
     16   end;
     17 
     18 procedure rotate(x,w:longint);
     19   var y:longint;
     20   begin
     21     y:=fa[x];
     22     if fa[y]<>0 then
     23     begin
     24       if son[fa[y],1]=y then son[fa[y],1]:=x
     25       else son[fa[y],2]:=x;
     26     end;
     27     fa[x]:=fa[y];
     28     son[y,3-w]:=son[x,w];
     29     if son[x,w]<>0 then fa[son[x,w]]:=y;
     30     son[x,w]:=y;
     31     fa[y]:=x;
     32     update(y);
     33     update(x);
     34   end;
     35 
     36 procedure up(i,x:longint);
     37   var j:longint;
     38   begin
     39     j:=fa[i];
     40     while j<>0 do
     41     begin
     42       if b[i]<b[j] then
     43       begin
     44         if son[j,1]=i then rotate(i,2)
     45         else rotate(i,1);
     46       end
     47       else break;
     48       j:=fa[i];
     49     end;
     50     if fa[i]=0 then root[x]:=i;
     51   end;
     52 
     53 procedure insert(x,y:longint);
     54   var p:longint;
     55   begin
     56     b[x]:=trunc(random*key)+1;
     57     count[x]:=1;
     58     son[x,1]:=0;
     59     son[x,2]:=0;
     60     p:=root[y];
     61     repeat
     62       inc(count[p]);
     63       if a[p]>=a[x] then
     64       begin
     65         if son[p,1]=0 then break;
     66         p:=son[p,1];
     67       end
     68       else begin
     69         if son[p,2]=0 then break;
     70         p:=son[p,2];
     71       end;
     72     until false;
     73     fa[x]:=p;
     74     if a[p]>=a[x] then son[p,1]:=x else son[p,2]:=x;
     75     up(x,y);
     76   end;
     77 
     78 procedure succ(x,y:longint);
     79   begin
     80     if son[x,1]<>0 then succ(son[x,1],y);
     81     if son[x,2]<>0 then succ(son[x,2],y);
     82     insert(x,y);
     83   end;
     84 
     85 procedure union(x,y:longint);
     86   var k1,k2:longint;
     87   begin
     88     k1:=getf(x);
     89     k2:=getf(y);
     90     if k1<>k2 then
     91     begin
     92       if count[root[k1]]>count[root[k2]] then
     93       begin
     94         f[k2]:=k1;
     95         succ(root[k2],k1);
     96       end
     97       else begin
     98         f[k1]:=k2;
     99         succ(root[k1],k2);
    100       end;
    101     end;
    102   end;
    103 
    104 function find(k,x:longint):longint;
    105   var p:longint;
    106   begin
    107     p:=root[x];
    108     while p<>0 do
    109     begin
    110       if count[son[p,1]]+1=k then exit(p);
    111       if count[son[p,1]]+1>k then p:=son[p,1]
    112       else begin
    113         k:=k-count[son[p,1]]-1;
    114         p:=son[p,2];
    115       end;
    116     end;
    117     exit(-1);
    118   end;
    119 
    120 begin
    121   randomize;
    122   readln(n,k);
    123   for i:=1 to n do
    124   begin
    125     read(a[i]);
    126     b[i]:=trunc(random*key)+1;
    127     f[i]:=i;
    128     root[i]:=i;
    129   end;
    130   for i:=1 to k do
    131   begin
    132     readln(x,y);
    133     union(x,y);
    134   end;
    135   readln(m);
    136   for i:=1 to m do
    137   begin
    138     readln(ch,x,y);
    139     if ch='Q' then
    140     begin
    141       x:=getf(x);
    142       writeln(find(y,x));
    143     end
    144     else union(x,y);
    145   end;
    146 end.
    View Code
  • 相关阅读:
    sqlserver查询某个数据库有多少个表 ,存过,函数,视图
    C# 金额转为大写金额
    C# TextBox中只能输入数字的几种常用方法(C#)
    C# 设置Excel单元格属性
    MS SQL 维护小记
    webapi demo
    远程 TeamViewer
    https://github.com/
    C# Fun 类似委托
    技术点文章收集
  • 原文地址:https://www.cnblogs.com/phile/p/4473027.html
Copyright © 2011-2022 走看看