首页 > 其他分享 >Splay 树

Splay 树

时间:2024-01-30 21:34:27浏览次数:20  
标签:splay int son Splay fa pushup root

Splay 树

定义

Splay 是一种高效的 BST,平摊复杂度为 \(O(\log n)\),可以快速访问热数据

rotate+splay 精华部分

splay双旋

一字旋:先fa再x

之字旋:先x再fa

旋根操作:最麻烦的地方,注意y每次循环要给他赋值

void rotate(int x){
	int y=t[x].fa,z=t[y].fa,k=t[y].son[1]==x;
	t[y].son[k] = t[x].son[k^1];
	t[t[y].son[k]].fa = y;
	t[x].son[k^1] = y;
	t[y].fa = x;
	if(z)t[z].son[t[z].son[1]==y]=x;
	t[x].fa = z;
	pushup(y);pushup(x);
}
void splay(int x,int goal){
	int y;
	while((y=t[x].fa)!=goal){
		if(t[y].fa!=goal)
			rotate((t[t[y].fa].son[1]==y)^
				(t[y].son[1]==x)?x:y);//不要调换x,y 
		rotate(x);
	}
	if(goal==0)root=x;
}

find 实用操作

BST的通用函数,注意要pushdown,因为其他操作要先调用它,所以免去splay时pushdown的麻烦事

int find(int p,int x){
	pushdown(p);
	if(x==t[ls(p)].siz+1)return p;
	if(x<=t[ls(p)].siz)return find(ls(p),x);
	return find(rs(p),x-t[ls(p)].siz-1);
}

split 关键操作

注意 split 修改完指定区间后要对root做pushup

void split(int l,int r){//钦定为ls(rs(root)) 
	int p=find(root,l-1),q=find(root,r+1);
	splay(p,0);
	splay(q,p);
}

build 必要操作

也要 pushup

void build(int &p,int L,int R,int Fa){
	if(L>R)return;
	p = mknode();
	t[p].fa = Fa;
	int mid=L+R>>1;
	t[p].val = a[mid];
	t[p].id = mid;
	if(L==R){
		t[p].sum = t[p].mx = a[L];
		t[p].rmx = t[p].lmx = max(a[L],0);
		t[p].siz = 1;
		return;
	}
	build(ls(p),L,mid-1,p);
	build(rs(p),mid+1,R,p);
	pushup(p);
}

复杂度

使用平摊分析的势能分析,插入删除的平摊费用为 \(O(\log n)\)

练习题

[NOI2005] 维护数列 提示:splay树

[AHOI2006] 文本编辑器 提示:splay树

【模板】文艺平衡树

[TJOI2007] 书架

标签:splay,int,son,Splay,fa,pushup,root
From: https://www.cnblogs.com/life-of-a-libertine/p/17998029

相关文章

  • 使用display:inline-block实现类grid布局时,元素的上下左右之间多了无法消除的间隔,去除
    错误如图 元素左右间隔,上下间隔,都不是手动设置的,布局换行之后自动出现的。 清除上下间隔方法。给每个div设置vertical-align:bottom/top;如果是下边距,就设置为bottom,上边距,就设置为top 清除左右间隔方法。没有尝试,但是网上搜的方法是,给父元素设置font-size:......
  • 华为常用的命令——display,记得点赞收藏!
    华为设备提供了多条display命令用于查看硬件部件、接口及软件的状态信息。通常这些状态信息可以为用户故障处理提供定位思路。常用的故障信息搜集的命令如下:路由器常用维护命令表交换机常用的故障信息搜集关注工仲好:IT运维大本营,获取60个G的《网工大礼包》......
  • 华为常用display命令合辑,真香!
    下午好,我的网工朋友。今天给你做了个命令整合,华为设备提供了多条display命令用于查看硬件部件、接口及软件的状态信息。通常这些状态信息可以为用户故障处理提供定位思路。需要的收藏起来哈。今日文章阅读福利:《网工必备华为网络交换机设备巡检手册》私信我,备注“手册”,前30名私信......
  • 配置内核的时候提示Your display is too small to run Menuconfig! It must be at lea
    按照按照  (https://rocketboards.org/foswiki/Documentation/EmbeddedLinuxBeginnerSGuide)制作了一个image当想打开内核kernel的配置界面makeARCH=armmenuconfig的时候提示:scripts/kconfig/mconfKconfigYourdisplayistoosmalltorunMenuconfig!Itmustbeatleast19......
  • php css 改变宽度,img标签设置display:block属性时宽度无法设定为100%的解决办法
    本篇文章所说的内容是img标签设置display:block属性时宽度无法设定为100%的解决办法,方法很详细,有一定的参考价值,有需要的朋友可以参考一下,希望可以对你有所帮助。现象如下代码,img标签设置了display:block,尺寸宽度无法设定为100%img标签设置display:block,宽度无法100%原因替换......
  • Splay 伸展树扩展应用
    Update2023.5.27好吧,lxl好像已经发明过这种数据结构了(悲)。前言谈谈扩展Splay。(下文用KzSplay代替)前置知识:1.Splay,以及文艺平衡树。2.线段树。问题引入请你设计一种数据结构,支持在线处理以下操作:给定一个长度为\(n\)的序列\(a\)。1.支持序列的区间翻转。2.支持......
  • Splay/LCT 学习笔记
    唔,其实我不会Splay,但是我会LCT。众所周知,会LCT和会Splay是两回事,因为LCT只需要旋至根即可。到现在还是不会,但是先把LCT的Splay写一下吧。自己复习用的。先给代码。LCTcodeintisroot(intx){returnch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}intidt(intx){retur......
  • 2023ICCV_FSI Frequency and Spatial Interactive Learning for Image Restoration in
     三.Network 1.  2.FLB:没看懂是怎么分离的水平和竖直方向 3.SLB:每一层保留一半的通道特征用于细化,其余的在特征重构后输出(没看懂)。Multi-distillationNetwork 超分辨网络的Multi-distillationNetwork(2019ACMMM_LightweightImageSuper-ResolutionwithIn......
  • NX二次开发UF_CSYS_set_wcs_display 函数介绍
    文章作者:里海UF_CSYS_set_wcs_displayDefinedin:uf_csys.h intUF_CSYS_set_wcs_display(intdisplay_status)overview概述Setdisplayofworkcoordinatesystem.展示工作坐标系。UFUN例子parameters参数intdisplay_statusInput1=thewcsshouldbedisplayed0=thewc......
  • 11月9日display属性
    目录display属性display属性值为nonedisplay属性值为blockdisplay属性值为inlinedisplay属性值为inline-block了解知识display属性该属性是用于控制HTML元素的显示效果值意义display:"none"HTML文档中元素存在,但是在浏览器中不显示。一般用于配合JavaScript代码使用......