splay学习】的更多相关文章

今天学习了一下spaly..... 感觉除了比较难打,比较难调,但还是很好理解的啊.... 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 6923  Solved: 2286[Submit][Status] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每…
这一篇博客只讲splay的前一部分的操作(rotate和splay),后面的一段博客咕咕一段时间 后一半的博客地址:[传送门] 前言骚话 为了学lct我也是拼了,看了十几篇博客,学了将近有一周,才A掉模板题和文艺平衡树. 这一片博客就是写了跟我之前有相同处境的小伙伴们.我尽可能的写的简单一点,在带一点自己学习时候的心得和总结.(难免会有一点冗长,大佬勿喷) 吐槽:splay=cosplay=slay(滑稽) 如要转载,请注明出处和作者:https://www.cnblogs.com/chhokm…
讲一下另外的所有操作(指的是普通平衡树中的其他操作) 前一篇的学习笔记连接:[传送门],结尾会带上完整的代码. 操作1,pushup操作 之前学习过线段树,都知道子节点的信息需要更新到父亲节点上. 因为旋转之后有两个节点的儿子和两个节点的父亲被改变了,那么原来的总儿子个数也就是sz就被改变了. 那么我们需要维护sz,就需要pushup操作. 这个东西比较简单. void pushup(int nod) { tr[nod].sz = tr[tr[nod].ch[0]].sz + tr[tr[nod…
(这里是Splay基础操作,reserve什么的会在下一篇里面讲) 好久之前就说要学Splay了,结果苟到现在才学习. 可能是最近良心发现自己实在太弱了,听数学又听不懂只好多学点不要脑子的数据结构. 感觉Splay比Treap良心多了——代码真的好写. 对于Splay显然可以维护Treap的所有操作,并且本质是BST. 先看看Splay是怎么维护普通平衡树操作的吧. 首先先定义一些基础的变量(若不作特殊说明这些变量的意义不变) int t[N][2] // t[x][0]表示节点x的左子树,t[…
胡扯 因为先学习的treap,而splay与treap中有许多共性,所以会有很多地方不会讲的很细致.关于treap和平衡树可以参考这篇博客 关于splay splay,又叫伸展树,是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.它由Daniel Sleator和Robert Tarjan创造.伸展树是一种自调整形式的二叉查找树,它会沿着从某个节点到树根之间的路径,通过一系列的旋转把这个节点搬移到树根去. splay与其他平衡树相比功能更加强大,可以处理区间问题.可以说其他平衡…
省选之前就大概搞了下$splay$,然后因为时间不太够就没写总结了,,,然后太久没用之后现在一回想感觉跟没学过一样了嘤嘤嘤 所以写个简陋的总结,,,肥肠简陋,只适合$gql$复习用,不建议学习用 然后先推荐两篇博客,,, $orz\ yyb$的博客$QwQ$(我之前就是看这个学的$QwQ$). $orz\ xzy$学长的博客$QwQ$(这篇总结了支持的操作然后还提供了题单,解释也挺详细的,我真的好爱这种形式的题解$TT$) 概念 $splay$是二叉搜索树的一种,和一般的平衡树不同的是,它对树高…
开个坑记录一下学习Splay的历程. Code 感谢rqy巨佬的代码,让我意识到了Splay可以有多短,以及我之前的Splay有多么的丑... int fa[N], ch[N][2], rev[N], sz[N], n; void upd(int x) { sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1; } void pd(int x) { if (rev[x]) { std::swap(ch[x][0], ch[x][1]); rev[ch[x][0]] ^=…
伸展树(Splay Tree),也叫分裂树,是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.(来自百科) 伸展树的操作主要是 –rotate(x) 将x旋转到x的父亲的位置 void splay(int x,int &k){ int y,z; while (x!=k){//如果x不是根节点 y=fa[x];z=fa[y]; if (y!=k){ ]==x)^(tr[z][]==y)) rotate(x,k);//见下 else rotate(y,k); } rotate(x,…
题目链接 Splay基础操作 \(Splay\)上的区间翻转 首先,这里的\(Splay\)维护的是一个序列的顺序,每个结点即为序列中的一个数,序列的顺序即为\(Splay\)的中序遍历 那么如何实现区间翻转呢? 对于一次区间翻转操作\(rev(l,r)\),显然先要找到\(l\)和\(r\)在\(Splay\)中的位置 然后把\(l-1\) \(splay\)到根结点,再把\(r+1\) \(splay\)到\(l\)的右儿子的位置 那么区间\([l,r]\)就到了一个子树上,即\(ch[r+…
二叉搜索树(二叉排序树) 概念:一棵树,若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉搜索树(baidu百科). 就是一棵二叉树,所有的节点都满足:左子树内每个的点的值比当前点值小,右子树内每个的点的值比当前点值大 如下图 我们只需在树上中序遍历就会得到一个上升的权值序列 我们可以在二叉搜索树上干很多事情,比如插入某个值,查询第k大值,查询某个数的排名等,显然单次操作最坏复杂度为树的深度,…