好开心!终于在昨天 写出splay来了T T
一开始认为很难啊!转来转去的,很麻烦的样子,后来就明白是什么了!感觉挺好写的,基本上看一遍 杨思雨 的关于splay的论文 照着她给的图就写出来了......我也不是什么大神,建议先看论文,网上应该也有模板什么的,我有一个pascal指针的模板,似乎是林厚从老师写的?我也不太晓得了= =
感觉splay对于单个数值的运算很方便,似乎splay也能类似于线段数那样做区间,但是标记一多= - =又转来转去的= - =。。。。好麻烦。!!!
大概的情况就是这样啦!反正splay就是一棵二叉排序树,然后转来转去的,使得这棵树尽量保持平衡。使得均摊为NLOGN....
code:
var
a,l,r,fa:array[0..100000] of longint;
root,x,i,n,ans:longint;
procedure zig(x:longint);
var
y,z:longint;
begin
y:=fa[x];z:=fa[y];
if root=y then root:=x;
l[y]:=r[x];
if r[x]<>0 then fa[r[x]]:=y;
r[x]:=y;
fa[y]:=x;fa[x]:=z;
if z=0 then exit;
if l[z]=y then l[z]:=x else r[z]:=x;
end;
procedure zag(x:longint);
var
y,z:longint;
begin
y:=fa[x];z:=fa[y];
if root=y then root:=x;
r[y]:=l[x];
if l[x]<>0 then fa[l[x]]:=y;
l[x]:=y;
fa[y]:=x;fa[x]:=z;
if z=0 then exit;
if l[z]=y then l[z]:=x else r[z]:=x;
end;
procedure splay(x:longint);
var
y,z:longint;
begin
if x=root then exit;y:=fa[x];
if y=root then
begin
if x=l[y] then zig(x) else zag(x);
exit;
end;
z:=fa[y];
if (l[y]=x) then
if (l[z]=y) then
begin
zig(y);zig(x);splay(x);exit;
end
else
begin
zig(x);zag(x);splay(x);exit;
end;
if (r[y]=x) then
if (r[z]=y) then
begin
zag(y);zag(x);splay(x);exit;
end
else
begin
zag(x);zig(x);splay(x);exit;
end;
end;
function min(x,k:longint):longint;
var
i,ans,j:longint;
begin
i:=l[k];ans:=maxlongint;
while i<>0 do
begin
if abs(a[i]-x)<ans then begin ans:=abs(a[i]-x);j:=i;end;
i:=r[i];
end;
i:=r[k];
while i<>0 do
begin
if abs(a[i]-x)<ans then begin ans:=abs(a[i]-x);j:=i;end;
i:=l[i];
end;
splay(j);
exit(ans);
end;
procedure insert(x,k:longint);
var
i,j:longint;
begin
if root=0 then
begin
root:=k;
a[k]:=x;
l[k]:=0;
r[k]:=0;
fa[k]:=0;
exit;
end;
i:=root;
a[k]:=x;
while true do
begin
if x<=a[i] then j:=l[i] else j:=r[i];
if j=0 then
begin
if x<=a[i] then l[i]:=k else r[i]:=k;
fa[k]:=i;
break;
end;
i:=j;
end;
splay(k);
end;
begin
read(n);ans:=0;
for i:=1 to n do
begin
read(x);
insert(x,i);
if i<>1 then ans:=ans+min(x,i) else ans:=x;
end;
writeln(ans);
end.
现在在写tyvj的平衡树*3= - =就是普通 文艺和二逼平衡树T T要抓紧啊!!!!!!
本文分享了一位开发者如何克服Splay树的复杂性,通过阅读论文和利用模板成功实现,并应用于解决平衡树相关问题的过程。文中详细介绍了Splay树的基本概念、操作方法,以及如何在实际编程中运用,特别提到了Splay树在单个数值运算上的便利性和在区间操作上的挑战。此外,作者还分享了一个简单的Splay树模板,以及如何将其整合到实际的编程任务中。
3691

被折叠的 条评论
为什么被折叠?



