splay专题

Splay树(区间更新)—— POJ 3468 A Simple Problem with Integers

对应POJ 题目:点击打开链接 A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072KTotal Submissions: 72765 Accepted: 22465Case Time Limit: 2000MS Description You have N integers, A1

Splay树(区间添加删除 | 区间翻转)——HDU 3487 Play with Chain

对应HDU题目:点击打开链接 Play with Chain Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4571    Accepted Submission(s): 1859 Problem Descript

【splay】BZOJ1208宠物收养所

1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec   Memory Limit: 162 MB Submit: 3620   Solved: 1364 [ Submit][ Status] Description 最近,阿Q开了一间宠物收养所。收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物。每个领养者都希望领养到自己满意的宠物,阿Q

树学习 ---------伸展树(splay Tree)

一、简介: 伸展树,或者叫自适应查找树,是一种用于保存有序集合的简单高效的数据结构。伸展树实质上是一个二叉查找树。 允许查找,插入,删除,删除最小,删除最大,分割,合并等许多操作,这些操作的时间复杂度为O(logN)。由于伸 展树可以适应需求序列,因此他们的性能在实际应用中更优秀。

Splay小结

Splay基本操作: 1.rotate() 旋转操作---包含三种情况 2.splay() 伸展-----一般是旋到根或根的父亲的下面 3.rotate_to() 先找到要伸展的结点,再splay; 4.push_up() 向上维护根的信息 5.push_down()向下下放延迟标记 6.Cut() 删除一个区间 7.insert()插入一个区间 8.Flip()翻转一个区间 9

BZOJ 1208 宠物收养所 Splay树

Splay的简单应用,找和一个数最接近的数,例如找和x最接近的数,把x旋转到根,要么是左子树的最大值,要么是右子树的最小值。 #include <cstdio>#include <cstring>#include <algorithm>#include <cstdlib>using namespace std;typedef long long LL;const int mod =

HDU 3436 Queue-jumpers Splay+离散化

有n个人从小到大排成一列,分别记为1,2...,m次询问,3种操作: 1.把x这个人放到队首。 2.求x这个人在哪个位置。 3.求x这个位置是那个人。 虽然最多有1亿个人,但是操作最多只有10w次,那就离散化,把连续一段没有出现过的数压缩成一个点,然后就是普通的Splay树了。 #include <cstdio>#include <cstring>#include <algorithm>u

BZOJ 1056 排名系统 Splay

实现一颗名次树,提供如下操作 上传一条新的得分记录、查询某个玩家的当前排名以及返回某个区段内的排名记录。 splay的基本的插入删除操作,在加一个hash映射名字和得分,不过可能值会相同。可以给每个节点增加一个表示时间的域,如果值一样,就以时间为第二关键字继续在子树中递归查找。

poj3481 Double Queue splay

题意:对于某种队列有3中操作,cmd =1 ,将优先级为p的顾客k加入队列 。 cmd=2,将队列优先级最高的顾客丢出队列并输出顾 客,cmd=3,将队列优先级最低的顾客丢出队列并输出顾客。 思路:用了splay,结果压根都没旋转操作。。找优先级小的就找最左端,然后把对应指针修改就行,找优先级大的就找最右端,然 后把对应指针修改就行。所以其实BIT就行了。详见代码: // file n

Codeforces 675D Tree Construction (splay)

转自:https://blog.csdn.net/dreamon3/article/details/51436043 题意 往一个根为a[0]的二叉搜索树里面插数,每插一个数就输出他的父节点。 思路 根据二叉搜索树的性质,我们插进去一个数,他的父节点肯定是比他小的最大的和比他大的最小的数里面的两个,然后这两个节点找最深的那个就是他的父节点,我们可以给这些节点设置一个时间戳就能判断先后顺序了。

简单splay模板

splay(x,y)表示将点x旋转到y的下面 fa[x]表示点x的父亲 t[x][0/1]表示点x的左/右儿子 updata用来维护需要维护的东西 标程均为求最大值 单点修改 #include<cstdio>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define N 101000using namesp

Splay Tree学习过程

我把学习经历贴上来(包括看过那些论文,参考过哪些 博客) http://en.wikipedia.org/wiki/Splay_tree http://www.link.cs.cmu.edu/splay/  demo http://www.artofproblemsolving.com/blog/54268 zkw大神 https://www.youtube.com/watch?v=n

伸展树Splay

Splay树,中文名一般叫做伸展树。和Treap树相同,作为平衡树,它也是通过左旋和右旋来调整树的结构。和Treap树不同的是,Splay树不再用一个随机的权值来进行平衡,而是用固定的调整方式来使得调整之后的树会比较平衡。 在左旋右旋的基础上,Splay树定义了3个操作: 1. Zig 直接根据x节点的位置,进行左旋或右旋。 该操作将x节点提升了一层。 2. Z

Splay 模板【NOI2005】 bzoj1500 维修数列

老师说写博客有助于学习和理解代码,所以从今天起,做一个写博客的人,面朝代码,春暖花开。 Splay是一种可以对一个数列进行区间修改,区间反转,查询最值,查询总和等操作的数据结构(我觉得Splay的结构类似于treap,功能类似于线段树),而且能够快速实现区间的分裂与合并。 Splay与Treap的最大区别是旋转方式,Treap将树按照堆得形式维护,只需要单旋。而Splay需要双旋,

Splay树 模板题入门

模板题①:HDU 4453 Looploop 以下代码摘自:https://blog.csdn.net/ck_boss/article/details/48031457 意识到这样的题原来才是模板题之后,我才知道Splay树中,翻转区间是很基本的功能。学到技巧:对区间[L,R]的翻转是用结点L-1和R+1作为一个边界,然后对其子节点标记翻转。很多Splay树的操作都利用了这个边界设置的技巧。

新技能:splay支持区间翻转,区间插入,区间删除

splay加两个哨兵左一个,右一个。这样便于提取区间。 建树时就一直放在前一个节点的右儿子即可,然后找一个中间的点splay到根 find操作支持找到区间当前第x位 提取区间:把l-1位上splay到根,第r+1位splay到root的右子树,然后[l,r]就在r+1位的左子树上。 然后具体的: 对于区间翻转: find当前区间那个点时一路pushdown懒标记,懒标记的思想和

splay tree讲解

http://www.cnblogs.com/kuangbin/archive/2013/04/21/3034081.html 类别:二叉排序树 空间效率:O(n) 时间效率:O(log n)内完成插入、查找、删除操作 创造者:Daniel Sleator和Robert Tarjan 优点:每次查询会调整树的结构,使被查询频率高的条目更靠近树根。 注:所有图片来自wiki。

POJ 3580 SuperMemo(splay成段更新、区间最小值、反转、插入和删除、区间搬移)

POJ 3580 SuperMemo(成段更新、区间最小值、反转、插入和删除、区间搬移) SuperMemo Time Limit: 5000MS Memory Limit: 65536KTotal Submissions: 5839 Accepted: 1884 Case Time Limit: 2000MS Description Your friend, Jac

(数据结构)如何手搓一棵伸展树(splay tree)

伸展树作为BST的又一个派生类 其主要特色是没每插入或查找一个节点,会把该节点通过一次次的旋转伸展至树根,并且减少树高 使得用户经过一段时间的使用后 高访问频率的数据集中在树根位置,查询深度浅,速度快 从而达到提高效率的目的 因此相较而言,AVL树更像是循规蹈矩,如履薄冰。而伸展树则更加潇洒,不羁小节。 例如一颗这样的伸展树 如果你访问001节点,即访问最底的节点 伸展树会把0

splay学习笔记重制版

以前写的学习笔记:传送门 但是之前写的比较杂乱,这里重制一下 问题背景 假设我们要维护一个数据结构,支持插入、删除、查询某个值的排名,查询第 k k k大的值等操作。 最直接的想法是用二叉搜索树,也就是左子树权值<根节点权值<右子树权值的数据结构。查询时,如果目标值小于根节点就往左走,否则往右走。 但是二叉搜索树的深度是没法保证的,树高可以达到 O ( n ) O(n) O(n)级别,这样我们

【BZOJ 2733】 [HNOI2012]永无乡|Splay启发式合并

代码能力太弱 #include <cstdio>#include <iostream>#include <algorithm> using namespace std;#define MAXN 100010int father[MAXN],root[MAXN];int fa[MAXN],to[MAXN][2],size[MAXN],num[MAXN],id[MAXN];int

平衡树学习(2)——Splay

Splay是一种平衡树,它的代码复杂度和时间复杂度稍弱于Treap,但由于其可以支持区间操作,所以在实战中还是有许多用处。 我们先来看看Splay的定义和基本思路。 伸展树(Splay Tree),也叫分裂树,它能在O(log n)内完成插入、查找和删除操作。在伸展树上的一般操作都基于伸展操作:假设想要对一个二叉查找树执行一系列的查找操作,为了使整个查找时间更小,被查频率高的那些条目就应当经常

【模板】普通平衡树(Treap/SBT)||Splay

题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入 xx 数 删除 xx 数(若有多个相同的数,因只删除一个) 查询 xx 数的排名(排名定义为比当前数小的数的个数 +1+1 。若有多个相同的数,因输出最小的排名) 查询排名为 xx 的数 求 xx 的前驱(前驱定义为小于 xx ,且最大的数) 求 xx 的后继(后继定义为大于 xx ,且最小

HDU 4585 Shaolin Splay 寻找前驱后继

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4585 每次添加一个数在集合中,并寻找这个数在集合排序后的前驱和后继 Splay模板题 每次将节点插入后 查找根左子树最右节点 和 根右子树最左节点 代码: #include <bits/stdc++.h>#define sf scanf#define pf printfusing na

Splay模板 Splay题型大荟萃

以HDU4453为例,整理了一些Splay的题型 /*【算法介绍】Splay叫做伸展树,是一种二叉搜索树,也可以说是一种平衡树结构。其可以维护节点的左右次序值,也就是说,我们在Splay上做中序遍历的次序输出节点,得到的便是所有节点的左右次序。【数据结构】int ch[N][2], fa[N]; //节点的链接关系int num[N], sz[N]; //节点个数与子树大小1,a

云心出岫——Splay Tree

(多图预警!!!建议在WI-FI下观看) 之前我们谈论过AVL树,这是一种典型适度平衡的二叉搜索树,成立条件是保持平衡因子在[-1,1]的范围内,这个条件已经是针对理想平衡做出的一个妥协了,但依然显得过于苛刻,因为在很多时候我们需要频繁的做重平衡操作,能不能改进一下,让失衡先积累着,然后等到某个时机,一下子全部解决呢?严谨一点来说就是我们能否秉持一种更为宽松的准则,同时又从长远、整体的角度来看,