LOJ#120. 持久化序列(FHQ Treap)】的更多相关文章

题面 传送门 题解 可持久化\(Treap\)搞一搞 //minamoto #include<bits/stdc++.h> #define R register #define inline __inline__ __attribute__((always_inline)) #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i) #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i) #de…
P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入\(x\)数 删除\(x\)数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询\(x\)数的排名(排名定义为比当前数小的数的个数\(+1\).若有多个相同的数,因输出最小的排名) 查询排名为x的数 求\(x\)的前驱(前驱定义为小于\(x\),且最大的数,如不存在输出\(-2…
题目链接 对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样).时间空间复杂度都为O(qlogq).(应该更大些 因为rand()?内存真的爆炸..) 对于无修改的操作实际上是可以直接赋值的,因为以后也不会去改当前树,只需要查询:修改时自会复制新节点. 虽然操作3.4.5.6不会改变原树,但是Split()会改变树的形态,所以仍要新建节点,但根节点不需要Merge(). #include <cstdio> #include <cctype> #includ…
Splay Splay(伸展树)是一种二叉搜索树. 其复杂度为均摊\(O(n\log n)\),所以并不可以可持久化. Splay的核心操作有两个:rotate和splay. pushup: 上传信息,比如区间和.子树大小... rotate: rotate实现把一个节点\(x\)转到它的父亲\(y\)的位置. 假设\(x\)是\(y\)的左儿子. 那么旋转完之后,\(y\)就会变成\(x\)的右儿子. 那么\(x\)原来的右儿子的地方就被占了,我们就把它放到\(y\)的左儿子. 实际上就是把\…
FHQ Treap,又称无旋treap,一种不基于旋转机制的平衡树,可支持所有有旋treap.splay等能支持的操作(只有在LCT中会比splay复杂度多一个log).最重要的是,它是OI中唯一一种支持可持久化的平衡树. 以下只提供题表与代码,不提供教程. 1.[BZOJ3224]普通平衡树 FHQ Treap的应用一:基础平衡树操作模板题. 由于merge.split和树高是$O(\log n)$的,所以所有基础操作都是$O(\log n)$的. #include<cstdio> #inc…
FHQ treap 的整理 treap = tree + heap,即同时满足二叉搜索树和堆的性质. 为了使树尽可能的保证两边的大小平衡,所以有一个key值,使他满足堆得性质,来维护树的平衡,key值是随机的. treap有一般平衡树的功能,前驱.后继.第k大.查询排名.插入.删除.也比较好写 但是对于区间上的问题是不能做的,例如 区间增减 区间求最值 区间反转(倒序) 区间移动(把一段剪切.粘贴) (splay是可以做的) 但是有一种神奇的数据结构,即可以满足treap的功能,也可以区间上进行…
题面 传送门 题解 \(FHQ\ Treap\)比起\(Splay\)还是稍微好写一点--就是老是忘了要下穿标记-- //minamoto #include<bits/stdc++.h> #define R register #define inline __inline__ __attribute__((always_inline)) #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i) #define fd(i,a,b) for(R i…
Preface 关于那些比较基础的平衡树我想我之前已经介绍的已经挺多了. 但是像Treap,Splay这样的旋转平衡树码亮太大,而像替罪羊树这样的重量平衡树却没有什么实际意义. 然而类似于SBT,AVL,RBT这些高级的乱搞平衡树无论时思想还是码量都让人难以接受. 而且在许多复杂的问题中需要维护区间,但是Splay的维护区间对于我这个蒟蒻来说实在是学不会. 许多的原因综合起来,在加上CJJ dalao的偶然安利,我便结识了神奇的FHQ Treap,一眼本命平衡树的感觉. 所以NOIP结束以后立马…
听说很对劲的太刀流不止会splay一种平衡树,并不对劲的片手流为了反驳他,并与之针锋相对,决定学学高端操作. 很对劲的太刀流-> 据说splay常数极大,但是由于只知道splay一种平衡树能对序列进行操作,或者进行分裂合并,还不能不写它. 那么常数略小的treap能否对序列操作或者分裂合并呢?想必是能的. 这就是fhq大神的可分裂与合并的treap(据说国家队人手一个自创算法?那必须的不然ctsc论文答辩怎么过). 它并没有比treap多出什么,反而省了好多事.核心操作只有split和merge…
FHQ Treap是什么? FHQ Treap,又名无旋Treap,是一种不需要旋转的平衡树,是范浩强基于Treap发明的.FHQ Treap具有代码短,易理解,速度快的优点.(当然跟红黑树比一下就是--)至少它在OI中算是很优秀的数据结构了. 前置知识: C++ 二叉搜索树的基本性质,下面会讲 二叉堆 二叉搜索树的基本性质 很简单,就这几个. 在二叉搜索树中,每个结点都满足左子树的结点的值都小于等于自己的值,右子树的结点的值都大于自己的值,左右子树也是二叉搜索树. 中序遍历二叉搜索树可以得到一…