- 2024-11-11斜率优化动态规划
静态维护凸包动态维护凸包Splay平衡树维护每个点向左、向右的线段的斜率\(lp,rp\)(初始为\(INF\)和\(-INF\)方便插入)插入一个点时,先加入Splay,再向左右找到最接近的,可与新点形成新的凸包的点,把中间点删掉,更新\(lp,rp\)即可具体实现:codecdq分治题目P4027[NOI2007]货币兑换
- 2024-11-02LCT
前置知识:Splay和文艺平衡树介绍LinkCutTree,简称LCT,时间复杂度分析细节原splay函数Rotate()中,注意son[z][]的赋值要有限制语句isroot(y),因为z可能是“认父亲不认儿子”的splay根节点的父亲(Splay()中的限制管不到,因为Splay()只考虑父亲,但Rotate()要考虑爷爷)voidRotate(int
- 2024-10-22洛谷P2596 [ZJOI2006] 书架 题解 splay tree 模板题
题目链接:https://www.luogu.com.cn/problem/P2596主要涉及的操作就是:找到某一个编号的点(这个操作可以不用splaytree维护)删除某个点将某一个点插入到最前面,最后面,或者某一个位置查询前序遍历为\(k\)的节点编号因为每次删除都会又把这个点加回去,所以可以复用\(n\)个
- 2024-10-14Maximum Rating
通过这道题,对Splay有了更深刻的理解Splay的中序遍历代表当前序列,通过查询排名为i的点找到序列中的第i个数,这些信息是完全由Splay的结构提供的通过Splay的编号,我们则可以访问到原序列对应的节点其实这道题完全是可以用线段树做的,既然普通线段树不行,那不妨用权值线段树实现【顺
- 2024-09-12Splay 浅谈
Splay树定义Splay树是一个二叉平衡搜索树,它可以通过Splay操作将一个结点旋转至根结点或者一个给定的结点的下一层,使得整棵树仍然满足二叉搜索树的性质。Splay树可以在均摊\(O(\logn)\)的时间内完成查找、插入、查询、删除等操作。二叉搜索树的定义:空树是一个二叉
- 2024-08-30平衡树
平衡树真的恶心死了!!!!!!好烦啊,又臭又长。有很多种平衡树,替罪羊,treap,fhq,slpay。这里就说splay,和bst和替罪羊了,因为其他我都不会(悲先说二叉排序树(二叉搜索树),他的关系就是左子树所有节点<根节点<右子树所有节点。也就是说,按照中序遍历可以找到有序序列。这个时候我
- 2024-08-30永无乡
考虑在线维护,显然用并查集。对每一个集合都维护一个Splay(或其他平衡树),然后直接查询就好了;所以现在的任务就是合并两个Splay。如果满足一个Splay的最大值小于另一个Splay的最小值,那么是可以快速合并的;但是这里显然不满足,所以只能用启发式合并,对于较小的Splay,遍历其每个节点,然后将每
- 2024-08-29Splay
涉及了区间翻转操作,Splay不再是BST;Splay只能保证其中序遍历为当前序列;用lazy标记做,具体见OI-wiki,代码见下#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=100010;structSplay{intl,r;intcnt,Size;intval,lazy;}a[N];int
- 2024-08-29【模板】普通平衡树
具体讲解见OI-wiki(他的左旋右旋跟蓝书的有点不一样,按照蓝书的理解,代码见下),下面是一些补充拓展:1.将一个序列插入到\(x\)的后面:找到\(x\)的后继\(y\),先将\(x\)伸展到根,再将\(y\)伸展到\(x\)的右子树,此时由于\(y\)是\(x\)的后继所以\(y\)的左儿子为空;对序列建出一棵二叉树(可以像线
- 2024-08-29[学习笔记] Splay & Treap 平衡树 - 数据结构
[学习笔记]Splay&Treap平衡树-数据结构Splay树又名伸展树,一种平衡二叉查找树,通过\(\text{Splay}\)操作不断把节点旋到根节点来维护整颗树的平衡。说人话,很玄学的玩意,复杂度是单log级别的。为啥是单log,科学的解释请移步OI-WIKI。不科学的解释就是,通过不断\(\tex
- 2024-08-27数据结构学习笔记
李超线段树学习笔记模板传送门从模板题就能看出来嗷,李超线段树非常牛逼。\bx从名字中就能看出来嗷,这玩意儿是个线段树。那么考虑在线段树上维护一堆线(一次函数)。对于每个点,存所有线中,使这个线段$mid$的点的线。对于加入一个点,根节点递归,扫到一个点时,若这个点在$mid$
- 2024-07-30动态树问题
[参考资料]LinkCutTree-OIWiki动态树练习题-题单-洛谷 一.动态树问题树上查询问题是指,给定一个图论中的树结构,需要对树上的子树或者链进行一系列改查的问题。和序列问题中一般常说的“动态”和“静态”不同。动态树问题一般指在树结构发生改变的情况下,在树
- 2024-07-17Splay 学习笔记
Splay树,或伸展树,是一种平衡二叉查找树,它通过Splay/伸展操作不断将某个节点旋转到根节点,使得整棵树仍然满足二叉查找树的性质,能够在均摊O(\logN)时间内完成插入,查找和删除操作,并且保持平衡而不至于退化为链。Splay树由DanielSleator和RobertTarjan于1985年发明
- 2024-07-16LCT小记
简介LCT是常用的一种动态树。对于一般的树上问题,我们会用树剖解决,但是如果遇到动态增删边的问题就需要LCT来解决。LCT的本质上是一种链剖分,我们将所有的边剖分为虚边和实边,所以整棵树是由若干条实链构成的,实链之间用虚边相连。我们通过splay来维护实链的信息,并以从上到下
- 2024-07-10splay 树
Splay树感谢OI-WIKI讲解1.定义splay是一种平衡二叉搜索树,由splay操作使时间复杂度O(nlogn)2.变量rt根节点编号tot节点个数计数tr[].fa父节点编号tr[].ch[0/1]左右儿子编号tr[].val该点记录的权值tr[].cnt该点记录的权值出现次数tr[].sz子树大小intrt,tot;structnode
- 2024-07-05FHQ treap(再见splay------)
但凡打过平衡树的应该都知道\(\huge{二逼平衡树}\)这道题,抄了两个小时的splay版题解,然后发现了\(\color{maroon}FHQtreap\):$\large\color{green}这是splay$structjjtree{ inlinevoidup(rintx){sz[x]=sz[son[x][0]]+sz[son[x][1]]+cnt[x];} inlineboolso(rintx){retu
- 2024-07-05splay-前驱后继
在平衡树中,经常会让我们查一下一个值的前驱和后继是谁,写两个函数就非常麻烦好吧,所以这里咱们用一点小技巧来让他变成一个函数(这里的前驱后继定义时包括与本身相等的值)代码点击查看代码intnxt(intk) { if(!m[rt].size)return0; introot=rt; while(k!=m[root].val&
- 2024-07-05封装目录
stringin_high_precisionforwardstarmatrixhigh_precision_vector3.0BITSlidingWindowdemap/vector/eint/fastioRanderStringAddition_InFixstringordered_vectorsplay
- 2024-07-04splay-前驱后继
在平衡树中,经常会让我们查一下一个值的前驱或后继是谁,写两个函数就非常麻烦好吧,所以这里咱们用一点小技巧来让他变成一个函数(这里的前驱后继定义时包括与本身相等的值)代码点击查看代码intnxt(intk) { if(!m[rt].size)return0; introot=rt; while(k!=m[root].val&
- 2024-07-02平衡树专题Splay
写在前面:部分来自孙宝(@Steven24)的博客,表示感谢。认识什么是Splay就是BST的一种,整体效率是很高的,均摊的次数是O(logn)级别的。基本操作就是把节点旋转到BST的root,从而改善BST的平衡性,但是很多人会在旋转中转晕建议找个动图看看,或是上B站找个几分钟的视频看看就理解了。烧烤
- 2024-06-23[题解]P2042 [NOI2005] 维护数列 - Splay解法
P2042[NOI2005]维护数列一道思路不难,但实现细节很多的平衡树题,调了一天半终于做出来了w。对于初始序列,我们可以直接构建一条链(毕竟一个一个调用插入函数也可能形成一条链)。题解有递归直接构建成一棵严格平衡的二叉树的,这样也可以,常数可能会小一点。其中区间反转就是裸的文艺
- 2024-06-20[题解]P3391 文艺平衡树 - Splay解法
P3391【模板】文艺平衡树给定序列\(1,2,\dots,n\),接下来\(m\)次操作,每次操作给定\(l,r\),你需要翻转\([l,r]\)。所有操作结束后,请输出这个序列。我们先从“普通平衡树”这一题出发,思考一下Splay操作的本质。我们把一个节点Splay到根节点后,中序遍历在自己前面的节点都在左边,中
- 2024-06-20[笔记]Splay树
前置知识:树的左旋、右旋。Splay树是一种平衡树。能够做到每个操作均摊\(O(\logN)\)。前言与上文AVL树不同之处在于,AVL树在任何操作结束后,都能保证每个节点的左右子树高度相差不超过\(1\)。相应地,每个操作都是严格的\(O(\logN)\)。而Splay树并没有对“平衡”的确切定义,任何结
- 2024-05-25平衡树 Treap & Splay [学习笔记]
平衡树\(\tt{Treap}\)&\(\tt{Splay}\)壹.单旋\(\tt{Treap}\)首先了解\(\tt{BST}\)非常好用的东西,但是数据可以把它卡成一条链\(\dots\)于是,我们将\(\tt{Tree}\)与\(\tt{heap}\)(堆)合并,以保证平衡树\(\log\)的深度。具体地,我们可以使用旋转操作实现K8He的图
- 2024-05-23平衡树 Treap & Splay [学习笔记]
平衡树\(\tt{Treap}\)&\(\tt{Splay}\)壹.单旋\(\tt{Treap}\)首先了解\(\tt{BST}\)非常好用的东西,但是数据可以把它卡成一条链\(\dots\)于是,我们将\(\tt{Tree}\)与\(\tt{heap}\)(堆)合并,以保证平衡树\(\log\)的深度。具体地,我们可以使用旋转操作实现K8He的图