上个月还在舔\(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的更多相关文章

  1. fhq_treap 总结

    今天跟着zcg大神学了一发fhq_treap 发现在维护区间问题上fhq_treap不仅思维量小,而且代码量更小 是Splay的不错的替代品,不过至今还是有一些问题不能很好的解决 譬如查询某个数在序列 ...

  2. [总结] fhq_Treap 学习笔记

    无旋版 $Treap$. 只需要两个操作即可达到 $splay$ 的所有功能 1.$split$ 它的主要思想就是把一个 $Treap$ 分成两个. $split$ 操作有两种类型,一种是按照权值分配 ...

  3. BZOJ1500 [NOI2005]维修数列-fhq_Treap

    题面见这里 反正是道平衡树,就拿 fhq_Treap 写了写... 这道题思路基本是围绕“用 Treap 维护中序遍历” 和 中序遍历的性质 来进行的操作 所以就可以类比线段树进行一些操作 1. 建树 ...

  4. 用 fhq_Treap 实现可持久化平衡树

    支持对历史版本进行操作的平衡树 Treap 和 Splay 都是旋来旋去的 这样平衡树可持久化听起来不太好搞? 还有 fhq_Treap ! 每次涉及操作就复制一个节点出来 操作历史版本就继承它的根继 ...

  5. Treap与fhq_Treap学习笔记

    1.普通Treap 通过左右旋来维护堆的性质 左右旋是不改变中序遍历的 #include<algorithm> #include<iostream> #include<c ...

  6. fhq_treap 学习笔记

    前言:昨天写NOIp2017队列,写+调辗转了3h+,不知道怎么的,就点进了一个神仙的链接,便在今日学习了神仙的fhq_treap. 简介:fhq_treap功能强大,支持splay支持的所有操作,代 ...

  7. 「模板」 FHQ_Treap 区间翻转

    「模板」 FHQ_Treap 区间翻转 没有旋转的 Treap 实现区间操作的功能,很好理解,也很好写,只是速度不算太快. 对于要翻转的区间,把整棵 Treap(存有区间 \([1,n]\) 的信息) ...

  8. 「模板」 FHQ_Treap

    「模板」 FHQ_Treap 我也是偶然发现我还没发过FHQ_Treap的板子. 那就发一波吧. 这个速度实在不算快,但是不用旋转,并且好写. 更重要的是,Splay 可以做的事情它都可以做!比如区间 ...

  9. POJ 3580 SuperMemo (FHQ_Treap)

    题意:让你维护一个序列,支持以下6种操作: ADD x y d: 第x个数到第y个数加d . REVERSE x y : 将区间[x,y]中的数翻转 . REVOLVE x y t :将区间[x,y] ...

  10. [note]fhq_treap

    fhq_treap 这东西据说是某个叫范浩强的神仙搞出来的, 他的这种treap可以不用旋转并且资磁很多平衡树操作, 复杂度通过随机的键值来保证(树大致平衡,期望一次操作复杂度\(logn\)) 依靠 ...

随机推荐

  1. Android 关于SD的操作

    1 http://www.cnblogs.com/shaoyangjiang/archive/2012/03/09/2388178.html 2

  2. Security Testing Basics

    Security Testing BasicsSoftware security testing is the process of assessing and testing a system to ...

  3. docker 查看容器挂载的目录

    $ docker inspect container_name | grep Mounts -A 20

  4. SendMessage用法

    SendMessage(hWnd,wMsg,wParam,lParam) 参数1:hWnd-窗口句柄.窗口可以是任何类型的屏幕对象. 参数2:wMsg-用于区别其他消息的常量值. 参数3:wParam ...

  5. homebrew可以管理众多开源软件的安装和卸载

    通过homebrew可以管理众多开源软件的安装和卸载. 参考https://github.com/mxcl/homebrew/wiki 1. 安装: ruby -e "$(curl -fsS ...

  6. CentOS 6.9上安装mysql-5.6.37

    CentOS 6.9上安装mysql-5.6.37 1.准备数据存放的文件系统 新建一个逻辑卷,并将其挂载至特定目录即可.这里不再给出过程. 这里假设其逻辑卷的挂载目录为/data,而后需要创建/da ...

  7. Linux 安装json神器 jq

    wget -O jq https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 chmod +x ./jq cp jq /u ...

  8. 在Linux下搭建Git服务器步骤

    环境: 服务器 CentOS6.6 + git(version 1.7.1) 客户端 Windows10 + git(version 2.8.4.windows.1)  ① 安装 Git Linux ...

  9. js浅度克隆/深度克隆

    首先弄明白几个概念: 一. 具体数据类型分为两种:  1.原始数据类型  2.引用数据类型 原始数据类型存储的是对象的实际地址,包括: number.string.boolean.还有两个特殊的nul ...

  10. EasyNVR完美搭配腾讯云CDN/阿里云CDN进行RTMP、HLS直播加速的使用说明

    1.相关资料入口 腾讯云LVB EasyNVR.com 2.加速说明 2.1. 腾讯LVB加速 2.1.1. 开通服务 腾讯云视频LVB开通入口 2.1.2. 登录进入控制台 腾讯云直播控制台 2.1 ...