tyvj1185 第一道 splay 平衡树

本文分享了一位开发者如何克服Splay树的复杂性,通过阅读论文和利用模板成功实现,并应用于解决平衡树相关问题的过程。文中详细介绍了Splay树的基本概念、操作方法,以及如何在实际编程中运用,特别提到了Splay树在单个数值运算上的便利性和在区间操作上的挑战。此外,作者还分享了一个简单的Splay树模板,以及如何将其整合到实际的编程任务中。

好开心!终于在昨天 写出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要抓紧啊!!!!!!
先展示下效果 https://pan.quark.cn/s/e81b877737c1 Node.js 是一种基于 Chrome V8 引擎的 JavaScript 执行环境,它使开发者能够在服务器端执行 JavaScript 编程,显著促进了全栈开发的应用普及。 在 Node.js 的开发流程中,`node_modules` 文件夹用于存储所有依赖的模块,随着项目的进展,该文件夹可能会变得异常庞大,其中包含了众多可能已不再需要的文件和文件夹,这不仅会消耗大量的硬盘空间,还可能减慢项目的加载时间。 `ModClean 2.0` 正是为了应对这一挑战而设计的工具。 `ModClean` 是一款用于清理 `node_modules` 的软件,其核心功能是移除那些不再被使用的文件和文件夹,从而确保项目的整洁性和运行效率。 `ModClean 2.0` 是此工具的改进版本,在原有功能上增加了更多特性,从而提高了清理工作的效率和精确度。 在 `ModClean 2.0` 中,用户可以设置清理规则,例如排除特定的模块或文件类型,以防止误删重要文件。 该工具通常会保留项目所依赖的核心模块,但会移除测试、文档、示例代码等非运行时必需的部分。 通过这种方式,`ModClean` 能够协助开发者优化项目结构,减少不必要的依赖,加快项目的构建速度。 使用 `ModClean` 的步骤大致如下:1. 需要先安装 `ModClean`,在项目的根目录中执行以下命令: ``` npm install modclean -g ```2. 创建配置文件 `.modcleanrc.json` 或 `.modcleanrc.js`,设定希望清理的规则。 比如,可能需要忽略 `LICENSE` 文件或整个 `docs`...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值