上个月还在舔\(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. Maven常见异常及解决方法(本篇停更至16-4-12)

    本篇文章记录了老猫在学习整合Maven和SSH过程中遇到的问题,有的问题可以解决.有的问题还不能解决. 方法不一定适合全部的环境.但绝对是本人常遇到的常见异常.在这里做一个笔记和记录,也分享给大家,希 ...

  2. poj 2762 Going from u to v or from v to u?(强连通、缩点、拓扑)

    题意:(理解错了)在一个洞穴中有多个room,要求任意选两个room:u.v,都能保证u.v之间有通路,注意洞穴中的路是有向边.. 分析:强连通子图中的点必然两两之间可以互通,两个强连通子图之间有通路 ...

  3. instantclient_11_2 连接oracle数据

    (1)首先你要先下载instantclient (解压如下),修改你     instantclient/network/admin/tnsnames.ora 文件,将你oracle的服务器地址写上 ...

  4. Linux下文件的堵塞与非堵塞对部分系统调用的影响

    1.基本概念 所谓的堵塞,即内核在对文件操作I/O系统调用时.假设条件不满足(可能须要产生I/O),则内核会将该进程挂起.非堵塞则是发现条件不满足就会马上返回. 此外须要注意的是非堵塞并非轮询.不然就 ...

  5. 并行归并排序——MPI

    并行归并排序在程序开始时,会将n/comm_comm个键值分配给每个进程,程序结束时,所有的键值会按顺序存储在进程0中.为了做到这点,它使用了树形结构通信模式.当进程接收到另一个进程的键值时,它将该键 ...

  6. 检测session用户信息跳转首页界面

    方案一:采用jsp方式检测用户信息跳转 <%@ page language="java" pageEncoding="UTF-8"%> <%@ ...

  7. 【Mac系统】之Mysql数据库遇到修改数字密码的问题(SQL语法错误:ERROR 1064 (42000),密码策略等问题:ERROR 1819 (HY000))

    安装完Mysql也进行了第一次初始化密码以及修改密码规则(请参考文章),但是我想后续再改密码,出现了下面几个问题: #SQL语句错误问题 ERROR 1064 (42000): You have an ...

  8. IntelliJ idea——》创建tag、删除tag

    https://blog.csdn.net/weixin_43453386/article/details/83857038

  9. element开源框架

    vue-element-admin:https://gitee.com/accest/bod-element   https://gitee.com/liuyuantao/vue-element-ad ...

  10. gIt 常用 操作

    git提交代码流程git status -- 查看当前仓库状态git add  -- 添加到临时仓库git commit -m '注释'  -- 添加到临时仓库git status -- 查看当前仓库 ...