splay

平衡树24题(更新中…)

情到浓时终转凉″ 提交于 2019-11-26 17:58:45
平衡树24题(更新中…) 前言: 我写的平衡树题里不是用Treap解决的,就是用Fhq-Treap写的,还有极少数是用Splay写的。 说说这几个树的区别与优劣: Treap是编码相对来说最容易的,但是由于它的结构不能改变,以致许多题目不能实现,区间操作也不行。一般来说,Treap可以打裸题,或者作为其它算法的辅助算法。 Fhq-Treap一般来说Splay能做的它都可以。编码比Splay容易,容易理解。功能强大。唯一不足的是在LCT没有Splay优秀。 Splay很灵活,一般所有情况都可以处理。但编码和理解难度比前两个稍大。我一般用Splay都是拿来打LCT。 Treap 【模板】普通平衡树 [HNOI2004]宠物收养场 中位数 [NOI2004]郁闷的出纳员 [TJOI2010]中位数 黑匣子_NOI导刊2010提高(06) 宝石管理系统 送花 鬼子进村 可怜的狗狗 来源: https://www.cnblogs.com/BigYellowDog/p/11329922.html

[LCT]luogu P3203 弹飞绵羊

点点圈 提交于 2019-11-26 15:46:31
https://www.luogu.org/problem/P3203 分析 还有个模板不想写题解了,反正这题也差不多是个模板 可以将一个点往后跳跃到的点连起来,跳出去的连到根节点+1,这就是棵树 要求支持删边连边和求根节点到这里的深度?LCT完全可以胜任 就是个板子,深度不用特别思考,Split直接提出来的是链,求Splay大小即可 #include <iostream> #include <cstdio> using namespace std; const int N=2e5+10; struct Node { int f,c[2],s,rev; }t[N]; int stk[N],top,v[N]; int n,m; bool Witch(int x) {return x==t[t[x].f].c[1];} bool Check_Root(int x) {return t[t[x].f].c[0]==x||t[t[x].f].c[1]==x;} void Reverse(int x) {swap(t[x].c[0],t[x].c[1]),t[x].rev^=1;} void Pushdown(int x) {if (t[x].rev) Reverse(t[x].c[0]),Reverse(t[x].c[1]),t[x].rev=0;} void Update(int x)

树-伸展树(Splay Tree)

帅比萌擦擦* 提交于 2019-11-26 14:58:14
伸展树概念 伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入、查找和删除操作。它由Daniel Sleator和Robert Tarjan创造。 (01) 伸展树属于二叉查找树,即它具有和二叉查找树一样的性质:假设x为树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] <= key[x];如果y是x的右子树的一个结点,则key[y] >= key[x]。 (02) 除了拥有二叉查找树的性质之外,伸展树还具有的一个特点是:当某个节点被访问时,伸展树会通过旋转使该节点成为树根。这样做的好处是,下次要访问该节点时,能够迅速的访问到该节点。 假设想要对一个二叉查找树执行一系列的查找操作。为了使整个查找时间更小,被查频率高的那些条目就应当经常处于靠近树根的位置。于是想到设计一个简单方法,在每次查找之后对树进行重构,把被查找的条目搬移到离树根近一些的地方。伸展树应运而生,它是一种自调整形式的二叉查找树,它会沿着从某个节点到树根之间的路径,通过一系列的旋转把这个节点搬移到树根去。 相比于"二叉查找树"和"AVL树",学习伸展树时需要重点关注是"伸展树的旋转算法"。 伸展树实现 伸展树的节点包括的几个组成元素: (01) key -- 是关键字,是用来对伸展树的节点进行排序的。 (02)

详细讲讲平衡树Splay实现过程

心不动则不痛 提交于 2019-11-26 12:02:39
前言: 作者的splay写法主要受到 https://www.luogu.org/blog/tiger0132/slay-notes 这篇文章的影响,所以代码实现基本重复,这里主要把那篇文章中没讲清楚的地方详细讲讲 Splay,又称伸展树,是平衡树的一种(蒟蒻我也只会写一种QWQ) 在讲平衡树之前,得先了解什么是二叉查找树 二叉搜索树,又称二叉搜索树,是一种优化查询数字的复杂度的数据结构,他的结点严格满足左结点小于根节点,右结点大于根节点 因此每次查找某个特定值,只要不断将它与当前结点比较大小,选择向左儿子走或者右儿子走,就一定能找到要找到的数字,下图就是一个标准的二叉搜索树: (画图随便画的,很丑QWQ) 上图就是一个优秀的例子,为什么?因为这恰好是一个完全二叉树,也就是说,你查询任何数的复杂度都能稳定在O(log n)级别 但是真的每次都这样吗?: 上图的这颗搜索树就由于插入顺序的原因退化成了一条链,最差情况下查询一个数字居然达到了 O(n) 的级别,这显然不是我们能接受的 (to be continue) 来源: https://www.cnblogs.com/Takarada-Rikka/p/11318905.html