treap学习笔记
treap是个很神奇的数据结构。
给你一个问题,你可以解决它吗?
这个问题需要treap这个数据结构。
众所周知,二叉查找树的查找效率低的原因是不平衡,而我们又不希望用各种奇奇怪怪的旋转来使它平衡,那么该怎么办呢?这时候,FHQ跳出来说了一句:我的treap,不需要旋转!
FHQ Treap的基本操作
首先要理解节点的修正值fix。这个值是在初始化的时候随机出来的,这个treap中所有的节点的fix要满足堆序
split
第一个操作是把一个treap分成两个treap,其中第一个treap的元素个数/数值最大值有要求,并且第一个treap中的所有元素要小于第二个treap中的所有元素
这个很好满足堆序,因为有这样一个性质:一个treap的子树一定也是个treap。所以我们递归一下,判断这个大treap的左子树是否满足条件,是否可以把左子树全部归给第一个treap就可以了。
merge
第二个操作是把两个treap合并成一个treap,其中第一个treap的所有元素小于第二个treap中的所有元素
二叉查找树的性质很好满足:第一个treap肯定是放在第二个treap的左子树或者第二个treap放在第一个treap的右子树。堆序也很好满足:直接判断两个根的fix的大小情况,看是把第一个treap放在第二个treap的左子树还是第二个treap放在第一个treap的右子树即可。
然后,根据这两个操作,我们可以轻易地做到所有的询问:
- 插入x:把treap按照小于等于x和大于x分成两个treap,把x作为单独一个treap,几个按顺序合并即可。
- 删除x:把treap按照小于x,等于x和大于x分成三个treap,把中间的那个扔掉,另外两个合并即可。
- 查询x的排名:把treap按照小于x和大于等于x分成两个treap,第一个treap的大小+1就是x的排名。
- 查询排名为x的数:直接和正常二叉查找树一样递归寻找大小大于等于k的第一个子treap就可以了
- 求x的前驱:把treap按照小于x和大于等于x分成两个treap,第一个treap的最后一个数就是x的前驱。
- 求x的后继:把treap按照小于等于x和大于x分成两个treap,第二个treap的第一个数就是x的后继。
FHQ Treap的高级操作
前面一道题直接套模板就很好解决,但是如果是这个问题呢?
这里就需要一些类似于线段树的懒标记的东西。对于每一个节点,我们除了之前存的子树大小,节点的值,节点的修正值外,还需要存下列东西:
- 该子树统一被赋的值
- 该子树是否已经被反转了
- 该子树的所有数字的和
- 该子树的最大前缀和、后缀和(可以不选)、子序列和
其中,第四项是专门处理6号询问的,我们可以用一种分治的思想:对于一个子treap内的最大子序列和,我们可以分成三种情况考虑:
- 这个最大和子序列全部位于这个treap的左子树内
- 这个最大和子序列全部位于这个treap的右子树内
- 这个最大和子序列跨左右子树,同时也包含这个节点上的数
前两种情况可以递归处理,第三种情况可以分成左子树的一个后缀+当前节点的值+右子树的一个前缀。
而最大前缀、后缀和又如何记录呢?以前缀为例,我们可以分成两种情况考虑:
- 这个最大和前缀完全包含在左子树内
- 这个最大和前缀跨整个左子树,当前节点和右子树的一个前缀
第一种情况可以递归处理,第二种情况也不难,就是左子树的和+当前节点值+右子树最大前缀
然后下推操作应该怎么实现呢?
不难发现顺序是这样的:
- 反转区间,即交换左右子树
- 修改权值,即把当前子treap统一赋的值更新
- 修改和,就根据新的赋值乘一下这个子树的大小
然后还要一个上拉操作,就是更新最大前缀、后缀和以及最大子序列和的操作,按照上面讲的做一下就好了
容易写错的地方
- 下推操作时注意是把两个儿子的子树和、前缀后缀最大和更新,而在刚打上标记的时候就应该把自己更新
- 反转区间的时候需要把最大前缀/后缀和交换一下
treap学习笔记的更多相关文章
- 左偏树 / 非旋转treap学习笔记
背景 非旋转treap真的好久没有用过了... 左偏树由于之前学的时候没有写学习笔记, 学得也并不牢固. 所以打算写这么一篇学习笔记, 讲讲左偏树和非旋转treap. 左偏树 定义 左偏树(Lefti ...
- fhq treap 学习笔记
序 今天心血来潮,来学习一下fhq treap(其实原因是本校有个OIer名叫fh,当然不是我) 简介 fhq treap 学名好像是"非旋转式treap及可持久化"...听上去怪 ...
- Treap + 无旋转Treap 学习笔记
普通的Treap模板 今天自己实现成功 /* * @Author: chenkexing * @Date: 2019-08-02 20:30:39 * @Last Modified by: chenk ...
- [Treap][学习笔记]
平衡树 平衡树就是一种可以在log的时间复杂度内完成数据的插入,删除,查找第k大,查询排名,查询前驱后继以及其他许多操作的数据结构. Treap treap是一种比较好写,常数比较小,可以实现平衡树基 ...
- Treap-平衡树学习笔记
平衡树-Treap学习笔记 最近刚学了Treap 发现这种数据结构真的是--妙啊妙啊~~ 咳咳.... 所以发一发博客,也是为了加深蒟蒻自己的理解 顺便帮助一下各位小伙伴们 切入正题 Treap的结构 ...
- 平衡树学习笔记(2)-------Treap
Treap 上一篇:平衡树学习笔记(1)-------简介 Treap是一个玄学的平衡树 为什么说它玄学呢? 还记得上一节说过每个平衡树都有自己的平衡方式吗? 没错,它平衡的方式是......rand ...
- FHQ treap学习(复习)笔记
.....好吧....最后一篇学习笔记的flag它倒了..... 好吧,这篇笔记也鸽了好久好久了... 比赛前刷模板,才想着还是补个坑吧... FHQ,这个神仙(范浩强大佬),发明了这个神仙的数据结构 ...
- 「学习笔记」Treap
「学习笔记」Treap 前言 什么是 Treap ? 二叉搜索树 (Binary Search Tree/Binary Sort Tree/BST) 基础定义 查找元素 插入元素 删除元素 查找后继 ...
- [学习笔记]平衡树(Splay)——旋转的灵魂舞蹈家
1.简介 首先要知道什么是二叉查找树. 这是一棵二叉树,每个节点最多有一个左儿子,一个右儿子. 它能支持查找功能. 具体来说,每个儿子有一个权值,保证一个节点的左儿子权值小于这个节点,右儿子权值大于这 ...
随机推荐
- 分布式日志框架之ExceptionLess【二】:自行搭建帮助文档【译文】
原文地址:https://github.com/exceptionless/Exceptionless/wiki/Self-Hosting ExceptionLess自行托管环境搭建 一.测试环境 如 ...
- yum 安装 php5.6.36
PHP安装测试可以 rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm; rp ...
- Vue性能优化
今天来谈一谈Vue中一些性能优化的问题,仅仅是个人使用中的一些小心得,来,今天我一句废话不多说,直接上内容好吧 1.v-if和v-show的使用, 我们都知道这两个都可以控制显隐,那我们用哪个呢,个人 ...
- 纯小白入手 vue3.0 CLI - 3.1 - 路由 ( router )
vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...
- 解决git did not exit cleanly (exit code 128)
最近在用git提交代码到部门服务器上的时候,总是有 提示 git did not exit cleanly (exit code 128).网上有2种解决方式: 1.替换路径 1.鼠标右键 -> ...
- Tsung CentOS 操作系统下搭建tsung性能测试环境_Part 1
CentOS 操作系统下搭建tsung性能测试环境_Part 1 by:授客 QQ:1033553122 步骤1.下载软件安装包 CentOS-6.0-x86_64-bin-DVD1.iso jdk- ...
- 服务器 nginx配置 防止其他域名绑定自己的服务器
基于我的网站被其他的域名恶意绑定了,我做出了如下处理,全站转https,同时配置nginx跳转禁止其他绑定ip的域名访问(原理主机空域名可绑定任意的,参考https://www.jb51.net/ar ...
- Python参数传递(传值&传引用)
# 测试参数是传值还是传引用def test(arg): print("test before") print(id(arg)) arg[1]=30 # 测试可变对象 # arg[ ...
- SpringBoot整合定时任务
定时任务一般是项目中都需要用到的,可以用于定时处理一些特殊的任务. 在SpirngBoot中使用定时任务变的特别简单,不需要再像SpringMVC一样写很多的配置,只需要在启动类上增加一个@Enabl ...
- 将 Azure 文件共享用于 Windows VM
可将 Azure 文件共享用作一种从 VM 中存储和访问文件的方式. 例如,你可以存储一个要与所有 VM 共享的脚本或应用程序配置文件. 本主题将介绍如何创建和装载 Azure 文件共享,以及如何上传 ...