FHQ_treap
上个月还在舔\(splay\):\(FHQ-treap\)太好打了吧真香
前言
还是建议先把\(splay\)学好再看,讲得会比较粗略(但该有的不会少),或者左转其他文章
\(FHQ-treap\)是一种常数小同时好打的平衡树
其实就是利用附加权值\((heap)\)来维护树的平衡性(形状),同时树内有二叉搜索树性质
附加权值是随机给的,随机情况下使得树比较平衡,达到均摊\(log\)级别
合并
把两棵树\((A,B)\)合并起来,其中\(A\)树的所有值\(<B\)树的所有值
我们在维护附加权值\((heap)\)的同时实现合并,由于大小关系的前提比较好做
int Merge(int x,int y){
if(!x || !y) return x|y;
Pushdown(x),Pushdown(y);
if(heap[x] < heap[y]){
son[x][1]=Merge(son[x][1],y); Update(x); return x;
}else{
son[y][0]=Merge(x,son[y][0]); Update(y); return y;
}
}
分裂
分裂有两种分裂,按值分与按排名分,传一个参数\(x\)进去把原树分成两棵树
即关键字\(≤x\)的一棵,剩下结点为另一棵
按排名分:
void Split_r(int now,int k,int &x,int &y){
if(!now) return (void)(x=y=0);
Pushdown(now);
if(size[son[now][0]]<k)
x=now, Split_r(son[now][1], k-size[son[now][0]]-1, son[x][1], y),
Update(x), Update(y);
else
y=now, Split_r(son[now][0], k, x, son[y][0]),
Update(x), Update(y);
}
操作区间
需要\((l,r)\)这个区间,分裂成\(a(1,l-1),b(l,r),c(r+1,n)\),把标记传进\(b\),然后再合并
总结
以上三个操作就是\(FHQ-treap\)的核心,做些题目去理解吧
FHQ_treap的更多相关文章
- fhq_treap 总结
今天跟着zcg大神学了一发fhq_treap 发现在维护区间问题上fhq_treap不仅思维量小,而且代码量更小 是Splay的不错的替代品,不过至今还是有一些问题不能很好的解决 譬如查询某个数在序列 ...
- [总结] fhq_Treap 学习笔记
无旋版 $Treap$. 只需要两个操作即可达到 $splay$ 的所有功能 1.$split$ 它的主要思想就是把一个 $Treap$ 分成两个. $split$ 操作有两种类型,一种是按照权值分配 ...
- BZOJ1500 [NOI2005]维修数列-fhq_Treap
题面见这里 反正是道平衡树,就拿 fhq_Treap 写了写... 这道题思路基本是围绕“用 Treap 维护中序遍历” 和 中序遍历的性质 来进行的操作 所以就可以类比线段树进行一些操作 1. 建树 ...
- 用 fhq_Treap 实现可持久化平衡树
支持对历史版本进行操作的平衡树 Treap 和 Splay 都是旋来旋去的 这样平衡树可持久化听起来不太好搞? 还有 fhq_Treap ! 每次涉及操作就复制一个节点出来 操作历史版本就继承它的根继 ...
- Treap与fhq_Treap学习笔记
1.普通Treap 通过左右旋来维护堆的性质 左右旋是不改变中序遍历的 #include<algorithm> #include<iostream> #include<c ...
- fhq_treap 学习笔记
前言:昨天写NOIp2017队列,写+调辗转了3h+,不知道怎么的,就点进了一个神仙的链接,便在今日学习了神仙的fhq_treap. 简介:fhq_treap功能强大,支持splay支持的所有操作,代 ...
- 「模板」 FHQ_Treap 区间翻转
「模板」 FHQ_Treap 区间翻转 没有旋转的 Treap 实现区间操作的功能,很好理解,也很好写,只是速度不算太快. 对于要翻转的区间,把整棵 Treap(存有区间 \([1,n]\) 的信息) ...
- 「模板」 FHQ_Treap
「模板」 FHQ_Treap 我也是偶然发现我还没发过FHQ_Treap的板子. 那就发一波吧. 这个速度实在不算快,但是不用旋转,并且好写. 更重要的是,Splay 可以做的事情它都可以做!比如区间 ...
- POJ 3580 SuperMemo (FHQ_Treap)
题意:让你维护一个序列,支持以下6种操作: ADD x y d: 第x个数到第y个数加d . REVERSE x y : 将区间[x,y]中的数翻转 . REVOLVE x y t :将区间[x,y] ...
- [note]fhq_treap
fhq_treap 这东西据说是某个叫范浩强的神仙搞出来的, 他的这种treap可以不用旋转并且资磁很多平衡树操作, 复杂度通过随机的键值来保证(树大致平衡,期望一次操作复杂度\(logn\)) 依靠 ...
随机推荐
- Android 关于SD的操作
1 http://www.cnblogs.com/shaoyangjiang/archive/2012/03/09/2388178.html 2
- Security Testing Basics
Security Testing BasicsSoftware security testing is the process of assessing and testing a system to ...
- docker 查看容器挂载的目录
$ docker inspect container_name | grep Mounts -A 20
- SendMessage用法
SendMessage(hWnd,wMsg,wParam,lParam) 参数1:hWnd-窗口句柄.窗口可以是任何类型的屏幕对象. 参数2:wMsg-用于区别其他消息的常量值. 参数3:wParam ...
- homebrew可以管理众多开源软件的安装和卸载
通过homebrew可以管理众多开源软件的安装和卸载. 参考https://github.com/mxcl/homebrew/wiki 1. 安装: ruby -e "$(curl -fsS ...
- CentOS 6.9上安装mysql-5.6.37
CentOS 6.9上安装mysql-5.6.37 1.准备数据存放的文件系统 新建一个逻辑卷,并将其挂载至特定目录即可.这里不再给出过程. 这里假设其逻辑卷的挂载目录为/data,而后需要创建/da ...
- Linux 安装json神器 jq
wget -O jq https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 chmod +x ./jq cp jq /u ...
- 在Linux下搭建Git服务器步骤
环境: 服务器 CentOS6.6 + git(version 1.7.1) 客户端 Windows10 + git(version 2.8.4.windows.1) ① 安装 Git Linux ...
- js浅度克隆/深度克隆
首先弄明白几个概念: 一. 具体数据类型分为两种: 1.原始数据类型 2.引用数据类型 原始数据类型存储的是对象的实际地址,包括: number.string.boolean.还有两个特殊的nul ...
- EasyNVR完美搭配腾讯云CDN/阿里云CDN进行RTMP、HLS直播加速的使用说明
1.相关资料入口 腾讯云LVB EasyNVR.com 2.加速说明 2.1. 腾讯LVB加速 2.1.1. 开通服务 腾讯云视频LVB开通入口 2.1.2. 登录进入控制台 腾讯云直播控制台 2.1 ...