![](https://img-blog.csdnimg.cn/20210922115145896.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构 - 平衡树 FHQ treap
文章平均质量分 92
数据结构 - 平衡树 FHQ treap
繁凡さん
只想当个小透明,就图一乐^q^,希望可以做出一些微小的贡献(目前研究方向:自然语言处理、深度学习中的对抗攻击、元学习,欢迎大佬们来与我交流^0^)
展开
-
2019 ICPC 南昌 K. Tree(树上启发式合并,平衡树 treap)
整理的算法模板合集: ACM模板点我看算法全家桶系列!!!实际上是一个全新的精炼模板整合计划题目链接https://nanti.jisuanke.com/t/42586Problem给定一个 nnn 个点的树,以及参数 kkk,树上每个点均有一个权值 vali\mathrm{val}_ivali。询问树上有序对 (x,y)(x,y)(x,y) 的数量,满足以下条件:xxx 不等于 yyyxxx 不是 yyy 的祖先yyy 不是 xxx 的祖先xxx 和 yyy 之间的距离不超原创 2021-09-15 21:05:57 · 1136 阅读 · 0 评论 -
平衡树 - treap
整理的算法模板合集: ACM模板operator 1 : 插入一个数operator 2 : 删除一个数operator 3 : 通过数值找排名operator 4 : 通过排名找数值operator 5 : 找到严格小于key的最大数(前驱)operator 6 : 找到严格大于key的最小数(后继)/*P3369 【模板】普通平衡树*/const int N = 100010, INF = 1e8 + 7;int n, m;struct node{ int l, r;//左原创 2020-08-20 13:00:48 · 701 阅读 · 0 评论 -
【数据结构】平衡树 - treap
treap = tree + heap 树堆(treap:让BST尽量随机)动态维护一个有序序列对于一个大根堆:最大值:一直往右走最小值:一直往左走treap实现操作set实现①插入insert②删除(使其变成叶子节点)erase③找前驱(中序遍历的前一个位置)/后继(中序遍历的后一个位置)lower_bound④找最大/最小begin(),end();⑤求某个值的排名无⑥求排名是k的数是谁无⑦比某个数小的最大值 ( 这个数可以不原创 2020-08-20 12:57:27 · 386 阅读 · 0 评论 -
luogu P2596 [ZJOI2006]书架(平衡树、无旋treap(按排名分裂)一些更复杂的操作)
无旋treap可以维护一棵树的中序遍历结果.但是不支持通过编号来找节点.于是在无旋treap的基础上,我维护了每个节点的父亲,这样就可以求出一个节点是中序遍历中的第几个.那么对于一个节点,每次将它向树根跳,如果它是右儿子,那么就将它父亲的左子树的值以及父亲的大小计入结果.那么问题就只有如何记录父亲了.显然会改变父亲的只有 split和merge操作,那么我只需要在这两个函数中修改就可以了.在split的时候再传两个参数记录父亲, merge在修改儿子的时候同时将父亲一起修改. 其他的都是无旋tre..原创 2020-09-24 16:53:32 · 269 阅读 · 0 评论 -
luogu P3850 [TJOI2007]书架(平衡树、无旋treap(按排名分裂))
luogu P3850 [TJOI2007]书架这里要的是字符串,所以我们最好用一个map映射一下,不要在结构体中用string代替val。fhq-treap中所有的排名实际上都指的是前面有多少个元素(前面有多少本书,例如实际排名为1,那么查询用的排名为0),而不是实际的排名,所以当我们insert的时候,我们按照习惯是从1到n,这里我们调用insert函数的时候要传入i-1,但是当我们根据题意insert的时候,输入的已经是平衡树中常用的“排名”了,就不用再–了。#include<cstdi原创 2020-09-24 16:49:32 · 187 阅读 · 0 评论 -
luogu P4847 银河英雄传说V2(FHQ - 平衡树)
初始情况下我们有 n 颗大小为 1的平衡树,合并就正常合并,分裂就正常分裂,但我们需要注意的是合并的标记值所在的序列而非标记值所在的元素,所以一个序列的代表就是它的根节点,我们不需要记录它,记录了反而复杂度更大,只需要维护每一个结点的父亲,一直往上跳,就可以找到根节点,需要注意的是,根节点的父亲为0 ,由于平衡树的树深大概是 log(n) 的,所以可以很优秀地找到树根并合并。我们要分裂时如何分裂,我们需要找到标记值为 x的元素是这个序列中的第几个,只需要一直往上跳父亲就好了,因为一个子树的根节点排名大..原创 2020-09-05 20:36:07 · 215 阅读 · 0 评论 -
luogu P3391 【模板】文艺平衡树(FHQ - treap,懒惰标记)
我们把每个查询区间使用solit分裂成[1 l−1][l r][r+1 n][1~l-1][l~r][r+1~n][1 l−1][l r][r+1 n]三个区间。再把[l r][l~r][l r]区间的根节点标记lazetage,三个区间合并时pushdown更新,我们要求整个区间实现翻转,可以直接交换左右儿子即可,因为整棵树是一个严格的小根堆,满足小根堆的性质,/*平衡树实际上画出来是一颗乱糟糟的小根堆,但是满足小根堆的.原创 2020-08-29 11:52:58 · 331 阅读 · 0 评论 -
模板 - FHQ - treap 无旋平衡树
整理的算法模板合集: ACM模板#include<bits/stdc++.h>using namespace std;const int N = 100007;int n, m, tot, root;struct node{ int l, r; int key;//权值 int val;//平衡因子 int size;//子树个数}tr[N];void pushup(int p){ tr[p].size = tr[tr[p].l]原创 2020-08-21 23:13:50 · 666 阅读 · 0 评论