fhq_treap 总结】的更多相关文章

今天跟着zcg大神学了一发fhq_treap 发现在维护区间问题上fhq_treap不仅思维量小,而且代码量更小 是Splay的不错的替代品,不过至今还是有一些问题不能很好的解决 譬如查询某个数在序列中的第几个位置QAQ fhq_treap的核心是split和merge可以logn的完成区间的分裂和合并 由于没有旋转所以可以支持可持久化 cojs 2314 可持久化fhq_treap的裸题,直接上代码 每次merge和split的时候新建一条链上的节点就可以啦 #include<cstdio>…
无旋版 $Treap$. 只需要两个操作即可达到 $splay$ 的所有功能 1.$split$ 它的主要思想就是把一个 $Treap$ 分成两个. $split$ 操作有两种类型,一种是按照权值分配,一种是按前 k 个分配. 第一种就是把所有小于 k 的权值的节点分到一棵树中,第二种是把前 k 个分到一个树里. 权值版: void split(int o,int k,int &x,int &y){ //这里的x,y分别是将以o为根的树切开后第一个新子树的根和第二个新子树的根 ; else…
题面见这里 反正是道平衡树,就拿 fhq_Treap 写了写... 这道题思路基本是围绕“用 Treap 维护中序遍历” 和 中序遍历的性质 来进行的操作 所以就可以类比线段树进行一些操作 1. 建树 & 插入 这题也要用到笛卡尔树的建树方式,假的 O(n) 真是相当快啊 建树的方式见这里 inline int build(int r) { top = 0; register int tmp = newnode(a[1]); stk[++top] = tmp; for(int i = 2; i…
支持对历史版本进行操作的平衡树 Treap 和 Splay 都是旋来旋去的 这样平衡树可持久化听起来不太好搞? 还有 fhq_Treap ! 每次涉及操作就复制一个节点出来 操作历史版本就继承它的根继续往下搞 在 Split 和 Merge 里加上有关可持久化的操作即可 这里因为写了根据权值来分割的 Split 所以就写比较传统的 getrank 了 = = 所以其他的一些涉及 Split 的操作都改了改 其实还是挺好写的 终于还是写了传引用的 Split #include<algorithm>…
1.普通Treap 通过左右旋来维护堆的性质 左右旋是不改变中序遍历的 #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cctype> #include<cstdio> #include<cmath> #include<ctime> using namespace std; const int…
前言:昨天写NOIp2017队列,写+调辗转了3h+,不知道怎么的,就点进了一个神仙的链接,便在今日学习了神仙的fhq_treap. 简介:fhq_treap功能强大,支持splay支持的所有操作,代码简单,仅有两个核心函数\(merge\)和\(split\),更重要的是,它作为无旋的平衡树,是支持可持久化的. 正题:fhq_treap的实现 (0)树的域 对树的每个节点,我们维护 \(ch[2],siz,dat,val\) 分别为左右儿子,子树大小,BST性质的关键字,堆性质的关键字 其中堆…
「模板」 FHQ_Treap 区间翻转 没有旋转的 Treap 实现区间操作的功能,很好理解,也很好写,只是速度不算太快. 对于要翻转的区间,把整棵 Treap(存有区间 \([1,n]\) 的信息)Split 成 \([1,l-1]\).\([l,r]\).\([r+1,n]\) 三部分,给中间部分的根节点打上标记,再一边下传标记一边 Merge 回来. 注意 Split 时,要按元素个数,不能按权值,因为元素个数可以通过维护节点信息的 size 域而直接得到,但随着区间的翻转,权值会乱套.…
「模板」 FHQ_Treap 我也是偶然发现我还没发过FHQ_Treap的板子. 那就发一波吧. 这个速度实在不算快,但是不用旋转,并且好写. 更重要的是,Splay 可以做的事情它都可以做!比如区间操作,以及LCT相关- 而且它还可以可持久化!(虽然目前还没有学) Capella 认为,不涉及区间操作时,用快一些的平衡树(SBT/Treap/替罪羊...)较好,涉及区间操作而又不想写大量代码的话,FHQ_Treap 不失为一种极好的选择. 下一篇写 FHQ_Treap 的区间操作. #incl…
题意:让你维护一个序列,支持以下6种操作: ADD x y d: 第x个数到第y个数加d . REVERSE x y : 将区间[x,y]中的数翻转 . REVOLVE x y t :将区间[x,y]循环移位t次,如1 2 3 4 5 旋转2次后就变成4 5 1 2 3 . INSERT x p :在第x个数后面插入p . DELETE x :删除第x个数 . MIN x y : 查询区间[x,y]中的最小值 .思路:此题有反转区间和循环移位的操作,所以我们很容易可以想到用 splay FHQ_…
fhq_treap 这东西据说是某个叫范浩强的神仙搞出来的, 他的这种treap可以不用旋转并且资磁很多平衡树操作, 复杂度通过随机的键值来保证(树大致平衡,期望一次操作复杂度\(logn\)) 依靠核心函数split和merge实现绝大多数操作 首先建树的话可以笛卡尔树优化到\(O(n)\),暴力merge\(O(nlogn)\) 通过以下几个操作进行说明(以下默认权值与v相同split到左边) 插入数v:将原树从v的位置分裂成x,y,合并x,v,再合并x,y. 删除数v:将原树从v-1分裂成…