码迷,mamicode.com
首页 > 其他好文 > 详细

splay

时间:2014-12-25 23:29:40      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:

终于写完基础的splay了,嗯,还差个区间翻转没写,下次补上。

  1 Program splay;
  2 const maxn=2000008;
  3 var l,r,fa,data,size:array[0..maxn] of longint;
  4     num,i,rt,x,n:longint;
  5 procedure init;
  6 begin
  7     rt:=0;
  8     for i:=0 to maxn do data[i]:=-1;
  9 end;
 10 procedure zig(i:longint);//右旋
 11 var j:longint;
 12 begin
 13     j:=fa[i];
 14     l[j]:=r[i];
 15     if l[j]<>0 then fa[l[j]]:=j;
 16     fa[i]:=fa[j];
 17     if fa[i]<>0 then
 18     if j=l[fa[i]] then     l[fa[i]]:=i
 19                   else    r[fa[i]]:=i;
 20     fa[j]:=i;
 21     r[i]:=j;
 22         size[j]:=size[l[j]]+size[r[j]]+1;
 23     size[i]:=size[l[i]]+size[r[i]]+1;
 24 end;
 25 procedure zag(i:longint);//左旋
 26 var j:longint;
 27 begin
 28     j:=fa[i];
 29     r[j]:=l[i];
 30     if r[j]<>0 then fa[r[j]]:=j;
 31     fa[i]:=fa[j];
 32     if fa[i]<>0 then
 33     if j=l[fa[i]] then l[fa[i]]:=i
 34                 else r[fa[i]]:=i;
 35     fa[j]:=i;
 36     l[i]:=j;
 37         size[j]:=size[l[j]]+size[r[j]]+1;
 38     size[i]:=size[l[i]]+size[r[i]]+1;
 39 end;
 40 procedure splay(x:longint);
 41 var y:longint;
 42 begin
 43     while fa[x]<>0 do
 44     begin
 45         y:=fa[x];
 46         if fa[y]=0 then
 47         begin
 48             if x=l[y] then zig(x)
 49                       else zag(x);
 50             break;
 51         end;
 52         if x=l[y] then
 53             if y=l[fa[y]] then begin zig(y); zig(x); end
 54                           else begin zig(x); zag(x); end
 55         else
 56             if y=r[fa[y]] then begin zag(y); zag(x); end
 57                           else begin zag(x); zig(x); end;
 58     end;
 59     rt:=x;
 60 end;
 61 procedure insert(x:longint);
 62 var p:longint;
 63 begin
 64     inc(num);
 65     data[num]:=x; size[num]:=1;
 66     if rt=0 then begin rt:=num; exit; end;
 67     p:=rt;
 68     while true do
 69     begin
 70         if x<data[p] then
 71         begin
 72             if l[p]=0 then
 73             begin
 74                 fa[num]:=p;
 75                 l[p]:=num;
 76                                 break;
 77             end    else p:=l[p];
 78         end
 79         else
 80         begin
 81             if r[p]=0 then
 82             begin
 83                 fa[num]:=p;
 84                 r[p]:=num;
 85                                 break;
 86             end else p:=r[p];
 87         end;
 88     end;
 89     splay(num);
 90 end;
 91 function search(x,p:longint):longint;//查找值为x的结点,如果找到返回所在结点,没找到返回0
 92 begin
 93     if (data[p]=-1) or (x=data[p]) then exit(p);
 94     if x<data[p] then exit(search(x,l[p]))
 95                  else exit(search(x,r[p]));
 96 end;
 97 function find(x:longint):longint;//x为查找的值 y为值所在的节点 找到返回节点 没找到返回-1 splay内部操作
 98 var p:longint;
 99 begin
100     p:=search(x,rt);
101     if data[p]=-1 then exit(-1);
102     splay(p);
103     exit(p);
104 end;
105 function findmin(p:longint):longint;//找以p为根结点的子树中的最小值
106 begin
107     while l[p]<>0 do p:=l[p];
108     splay(p);
109     exit(data[p]);
110 end;
111 function findmax(p:longint):longint;//找以p为根结点的子树中的最大值
112 begin
113     while r[p]<>0 do p:=r[p];
114     splay(p);
115     exit(data[p]);
116 end;
117 function findpred(x:longint):longint;//找某个值的前趋
118 var p:longint;
119 begin
120     p:=find(x);
121     exit(findmax(l[p]));
122 end;
123 function findsucc(x:longint):longint;//找某个值的后继
124 var p:longint;
125 begin
126     p:=find(x);
127     exit(findmin(r[p]));
128 end;
129 procedure join(x,y:longint);//合并
130 var p:longint;
131 begin
132     if x=0 then begin rt:=y; fa[y]:=0; exit; end;
133     if y=0 then begin rt:=x; fa[x]:=0; exit; end;
134     p:=findmax(x);
135     r[p]:=y; fa[y]:=p;
136     rt:=p;
137 end;
138 procedure delete(x:longint);
139 var p:longint;
140 begin
141     p:=find(x);
142     join(l[p],r[p]);
143         l[p]:=0; r[p]:=0;
144 end;
145 function found(x,now:longint):longint;//找第k大的数
146 begin
147     if x=size[r[now]]+1 then exit(data[now]);
148     if x>size[r[now]]+1 then exit(found(x-size[r[now]]-1,l[now]));
149     if x<size[r[now]]+1 then exit(found(x,r[now]));
150 end;
151 begin
152     init;
153     readln(n);
154     for i:=1 to n do
155     begin
156         read(x);
157         insert(x);
158     end;
159     for i:=1 to n do write(found(n-i+1,rt), );
160 end.

 

splay

标签:

原文地址:http://www.cnblogs.com/rpSebastian/p/4185725.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!