首页 > TAG信息列表 > splay
平衡树Splay与FHQ
树剖的未来会补的(卑微)。 这里想讲讲平衡树,因为看着高级,可以证明我学过OI。 我们先了解下 \(BST\),也就是平衡二叉树。 他的概念是,对于每一个非叶子结点,他的左儿子一定小于当前节点,右儿子必定大于当前节点。 类似于如下图,就是一个好看的 \(BST\): 那我们现在对平衡二叉树有了深入的splay树
splay树 概念 splay树也是一种二叉查找树,同时也会通过旋转的操作保证一定的平衡。与普通的平衡树 (AVL) 相区别的是它可以将需要的节点不断向根节点旋转,这个过程被称作伸展。splay树可以高效的完成区间删除、区间插入、区间翻转以及其他二叉排序树的功能。这里以 HDU-3487为例,介绍【科技】 平衡树-splay
0.前言 我们都知道,二叉搜索树在随机数据下具有优良的性质,可以 \(O(\log n)\) 内实现插入、删除、按值找排名、按排名找值等操作。 但这是建立在随机数据保证的一个节点左右儿子的大小几乎相同的前提下的,如果有居心叵测的出题人构造有序或者几乎有序的序列依次插入二叉搜索树,那树高莞中 2022暑假训练题02:平衡树
FHQ-Treap 此文章所有代码中的平衡树均为 FHQ-Treap。 FHQ-treap 即非旋Treap,是一种短小精悍,功能丰富的平衡树。 据说它的效率介于 Treap 和 Splay 之间(可能是我的FHQ常数比较小,跑得比我的Treap还快)。 它可以实现 Splay 可以实现的所有功能,包括平衡树的基本操作和区间翻转操作。动态树 $(LCT)$
目录动态树 \((LCT)\)前言基本思路及实现\(\text{Part I}\) 实链剖分\(\text{Part II Splay}\)\(\text{Part III}\) 核心操作 【模板】动态树(\(\text{Link Cut Tree}\)) 动态树 \((LCT)\) 前言 \(\text{LCT}\),全名 \(\text{Link Cut Tree}\),一般基于 \(\text{Splay}\) + 实链剖分162 文艺平衡树 Splay
视频链接: // Luogu P3391 【模板】文艺平衡树 #include <iostream> #include <algorithm> using namespace std; const int N=100010; int n, m; struct node{ int s[2], p, v; int size, tag; void init(int p1,int v1){ p=p1; v=v1; size=1; } }tr[N]; int ro平衡树——splay 一
splay 一种平衡树,同时也是二叉排序树,与treap不同,它不需要维护堆的性质,它由Daniel Sleator和Robert Tarjan(没错,tarjan,又是他)创造,伸展树是一种自调整二叉树,它会将一个节点沿着到根的路径旋转上去。 空间效率:On 摊平时间效率:Ologn 存储结构 int ch[N][2],fa[N];//左孩子,右孩子,LCT 板子
namespace LCT { int f[N], c[N][2], s[N], st[N]; bool r[N]; inline bool nroot(int); inline void pushup(int); inline void pushr(int); inline void pushdown(int); inline void rotate(int); inline void splay(int); inline void access(int); inline void makeroot(i1063. 永无乡
题目链接 1063. 永无乡 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 \(n\) 座岛排名,名次用 \(1\) 到 \(n\) 来表示。 某些岛之间由巨大的桥连接,通过桥可以从一个岛到达另一个岛。 如果从岛 \(a\) 出发经过若干座(含 \(0\) 座)950. 郁闷的出纳员
题目链接 950. 郁闷的出纳员 OIER 公司是一家大型专业化软件公司,有着数以万计的员工。 作为一名出纳员,我的任务之一便是统计每位员工的工资。 这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。 如果他心情好,就可能把每位员工的工资加上一个相同的量平衡树(Splay)
平衡树 不同平衡树 有许多不同的平衡树 如:替罪羊树,AVI,红黑树,Treap,FHQ-Treap (无旋Treap),Splay,SBT 等 其中比较重点的是上述后四种 目前只学习了 Splay 和 Treap 能够较为熟练的打出来的只有 Splay 有关 Splay 代码 (luoguP3396) : #include<bits/stdc++.h> using namespace std; iLCT学习笔记
概念 前置芝士:链剖分 链剖分:指一类对树的边进行划分的操作,这样做可以减少某些链上的修改、查询等操作的复杂度。链剖分分为重链剖分,实链剖分和长链剖分(不常见)。 重链剖分:实际上树剖就是重链剖分的常用称呼。可以看看 树链剖分学习笔记 实链剖分:同样将某一个儿子的连边划分为实边,LCT 学习笔记
LCT 学习笔记 还在更新…… 看看学弟们几天后会把 LCT 给卷了:cntnow = 0 LCT 好难啊呜呜呜 这 LCT,尤其是 makeroot 中的区间翻转一步,根本不是人想到的。 虽然 Splay 也不是人想到的。 写了一些忽然发现网上有写的很好的了,那就这样,图直接放人家的,主要用来存代码方便背代码( 再写这样Splay
关于Splay有个小点,但确实调了一会。 为了中考三周没打过代码了,手实在是生了。 rotate函数里的三组关系写的时候是有顺序之分的。一般都是先处理x和z的关系(这最简单),然后再处理ch和y、x和y的关系。要注意的是ch和y的关系要先写,不然会出现错误,错误原因是由于rotate的过程中y会取代原Splay
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e6 + 5; const int mod = 1e9 + 7; const int INF = 2147483647; inline int read() { int x = 0, f = 1; char ch = getchar(); while(ch > '92022做题记录
目录【变形背包DP】LGP2340 [USACO03FALL]Cow Exhibition G【区间dp】【破环成链】[NOI1995]石子合并【区间dp】LGP3146 [USACO16OPEN]248 G【区间dp】【破环成链】LGP1063 [NOIP2006 提高组] 能量项链【破环成链】【区间dp】LGP4342 [IOI1998]Polygon【斜率优化】BZOJ3437 小P的重修 LCT
Link Cut Tree 可以理解为动态的树链剖分,且链的维护是 splay。 在这之前一定要把 splay 写熟练了,不然吃大亏。 splay 板子来这里 P3690 【模板】动态树(Link Cut Tree) 指针版 Code 不好意思只会写指针版的动态树基础
Dynamic Tree 前置知识:线段树 Splay 维护区间翻转,\(O(n)=10^6\) 显然,这样的操作不能用线段树来维护,因为线段树的结构是固定的,我们需要一种结构上更加灵活的数据结构 于是联想到平衡树,如果以,对于一个区间 \([l,r]\),我们只需要知道 \(l-1\) 和 \(r+1\) 在平衡树上的位置就可以了,其我做过的题们(数据结构&图论)
1.数据结构 树状数组&线段树 序列 线段树优化统计过程,我的方法和基站选址异曲同工。 西瓜树之二 一道比较巧妙的题目。 or SPJ 一道比较简单的构造题,线段树起构造解的作用。 链上二次求和 一道公式题,把式子推出来后没那么难。 [HEOI2012]采花 很简单的一道题,评紫实在有点暴殄平衡树(Splay) 服务:第一弹——旋转的艺术
平衡树(Splay) 服务:第一弹——旋转的艺术 0.前言 本蒟蒻前不久刚学SPLAY,有了一点心得,想要巩固下来。同时也觉得网上的神犇们实在太强了,有的内容并不能很好的让我这样的蒟蒻理解,因此便有了我这篇RBQ级服务的博客。我的splay是看自有风月马前卒学的,因此部分代码可能有些相似。P3369 【模板】普通平衡树 splay解法
P3369 【模板】普通平衡树 #include <bits/stdc++.h> using namespace std; const int N = 200005; int ch[N][2], par[N], val[N], cnt[N], size[N], ncnt, root; bool chk(int x) { return ch[par[x]][1] == x; } void pushup(int x) { size[x] = size[ch[x][0]] + si[COI2009] OTOCI
link 一道比LCT模板还要模板的模板(它甚至没有cut操作),主要借此题来阐述几个代码上的细节。 第一个是makelink函数。以下写法上对下错: inline void makelink(int x,int y){ makeroot(x); if(findroot(y)^x)t[x].f=y; } inline void makelink(int x,int y){ makeroot(x); if(fin【洛谷p3391】 Splay模板 文艺平衡树
题目 模板题。 注意标记即可,另外,涉及区间翻转操作,记得设立首尾哨兵。 #include<bits/stdc++.h> using namespace std; const int Maxn=0x3f3f3f3f; const int N=1e5+5; int lc[N],rc[N],fa[N],sze[N],vi[N],pos[N],a[N]; int n,m,x,y,rt,T; inline int get(){//快读 char ch;平衡树(Splay) artalter级服务:第二弹——插入,删除,查询
平衡树(Splay) artalter级服务:第二弹——插入,删除,查询 0.前言 今天有奥赛课,所以我又回来了 今天会把普通平衡树的操作讲完 1.插入 首先,在splay中,是不会有权值(也就是平衡树排大小的关键字)重复的结点的。取而代之的,是表示这个值出现次数的附加值cnt. 插入操作可以分为几种情况: 1.平【P2710 数列】【Splay】
【P2710 数列】【Splay】 Splay的经典模板题,细节非常多。这里主要记录一些容易错的点,和不太容易理解的地方 pushdown 函数和懒标记的含义 有两种写法: 第一种是懒标记代表其子节点是否更新,这也是通常的写法(线段树和平衡树都是),在这种写法中,pushdown的作用是将子节点的信息更新。 这