FHQ-Treap

FHQ-Treap(非旋treap/平衡树)——从入门到入坟 平衡树有很多种,其中fhq-treap 可以说是最强的一种平衡树之一,它可以维护值域,也可以维护下标,还能维护区间修改,更难能可贵的是,它可以完成splay都完成不了的可持久化操作。其唯一弱于splay的就是在LCT上,splay维护LCT的复杂度是O(nlog(n)),而fhq-treap的复杂度为O(nlog^2(n)),稍微大了一点,但是比splay好写多了。............ 阅读详情

昨天,我们亲爱的学长教了我们 F H Q − T r e a p FHQ-Treap FHQ−Treap orz,于是有了这篇题解。

What is it

F H Q − T r e a p FHQ-Treap FHQ−Treap 由巨佬范浩强发明的一种数据结构不然怎么叫FHQ,免掉了 S p l a y Splay Splay 等基于旋转操作的平衡树的麻烦操作。

特点:码量少,易理解,常数贼大

Pre cheese

首先,我们要知道, T r e a p = T r e e + H e a p Treap=Tree+Heap Treap=Tree+Heap

所以,我们就有了以下两块芝士(逃~

1. 二叉搜索树

首先,二叉搜索树是一颗二叉树。

你问我二叉树是什么?

出门右转度娘在等着你

二叉树都不知道先去 度娘 那深造一下吧

二叉搜索树有一个最基本的性质:左儿子<父节点<右儿子(值)

易得左子树所有的值<父节点的值<右子树所有的值

2. 堆

懒得说了,走你

How to create it

首先,我们要知道, F H Q − T r e a p FHQ-Treap FHQ−Treap 是一种基于分裂和合并两种基操的平衡树。

1. 基操:分裂(Split)

分裂有分为两种:按大小分裂和按排名分裂(据神犇说按排名分裂没必要)

既然这样,那我就只讲按大小分裂吧。(逃~

按大小分裂是把树拆成两棵树,拆出来的一棵树的值全部小于等于给定的值,另外一部分的值全部大于给定的值

先贴两个图:

分裂前,这棵树长这样:

image.png

分裂后,变成了这样:

image.png

某些同学快点起来,上代码了

上代码

void split(int now,int val,int &x,int &y)
{
    if(!now) x=y=0;//到根时,x和y要初始化
    else 
    {
        if(fhq[now].val<=val)
        {
            x=now;
            split(fhq[now].r,val,fhq[now].r,y);
        }
        else 
        {
            y=now;
            split(fhq[now].l,val,x,fhq[now].l);
        }
        update(now);
    }
}

这串代码最关键在于引用 & \& & 哈。

2. 基操:合并(merge)

合并只有一种 分裂,你过来,看看人家

合并就是把两颗树 x x x, y y y 合并成一棵树,其中 x x x 树上的所有值都小于等于 y 树上的所有值。并且新合并出来的树依旧满足 T r e a p Treap Treap 的性质(如果不满足就说明你写错了,你就把电脑砸了重构一下)

图片:

把上面分裂的图片反过来(逃~

那些同学又睡了?起来一下

上代码

int merge(int x,int y)
{
    if(!x||!y) return x+y;
    if(fhq[x].key>fhq[y].key)
    {
        fhq[x].r=merge(fhq[x].r,y);
        update(x);
        return x;
    }
    else 
    {
        fhq[y].l=merge(x,fhq[y].l);
        update(y);
        return y;
    }
}

3. 重磅:插入(insert)

想象一下,有一沓纸,你要从中插入一张,怎么办?

拿开上面一沓,放一张在中间,再合上。

我们良心的 i n s e r t insert insert 也是如此,掰开一棵树,插入一个点,再把三部分捏在一起。

各位应该都懂了吧(逃~

上代码!!!

void ins(int val)
{
    split(root,val,x,y);
    root=merge(merge(x,newnode(val)),y);
}

5行代码良心啊

4. 重磅:删除

同样的,在一沓纸中取出一张,怎么办?

将它上面的拿开,再将那张纸拿出来,再将上面和下面再次叠在一起。

亲爱的 d e l del del 也是如此,分两次掰开这棵树,使其与上下分离,再将他的上下两部分合在一起。

上代码

void del(int val)
{
    split(root,val,x,z);
    split(x,val-1,x,y);
    y=merge(fhq[y].l,fhq[y].r);
    root=merge(merge(x,y),z);
}

------------------------分割线------------------------

剩下还有几种诸如查前驱后继、查值、查排名的操作我就不说了哈,直接给代码

void getrank(int val)
{
    split(root,val-1,x,y);
    cout<<fhq[x].size+1<<"\n";
    root=merge(x,y);
}
void getnum(int rank)
{
    int now=root;
    while(now)
    {
        if(fhq[fhq[now].l].size+1==rank)
            break;
        else if(fhq[fhq[now].l].size>=rank)
            now=fhq[now].l;
        else 
        {
            rank-=fhq[fhq[now].l].size+1;
            now=fhq[now].r;
        }
    }
    cout<<fhq[now].val<<"\n";
}
void pre(int val)
{
    split(root,val-1,x,y);
    int now=x;
    while(fhq[now].r)
        now=fhq[now].r;
    cout<<fhq[now].val<<"\n";
    root=merge(x,y);
}
void nxt(int val)
{
    split(root,val,x,y);
    int now=y;
    while(fhq[now].l)
        now=fhq[now].l;
    cout<<fhq[now].val<<"\n";
    root=merge(x,y);
}

至于练习题的话,自己上洛谷找吧(逃~

完结撒花!

给个三连吧

【Unity】Unity性能分析解决方案——UPR 由Unity中国团队提供的一套性能优化解决方案,其是一系列性能工具的集合,并可将收集的数据进行可视化。 阅读详情

相关推荐

C# WinForms实战:5分钟用ScottPlot打造专业级示波器界面(附完整代码)

本文详细介绍了如何在C# WinForms应用中,利用ScottPlot.WinForms库快速构建一个专业级的软件示波器界面。通过从环境配置、静态波形绘制到动态数据实时更新的完整实战演示,帮助开发者高效实现高性能的波形显示功能,适用于工业监控、信号分析等多种场景。

weixin_29198045的博客 831

[C++ 学习笔记] FHQ-Treap (无旋 Treap)

C++ FHQ-Treap - 无旋 Treap - 树堆 学习笔记

lzl20220405的博客 3171

Vitis开发环境下的双核ARM通信:Hello World背后的AMP架构解析

本文深入解析了Vitis开发环境下ZYNQ双核ARM Cortex-A9处理器的AMP架构与通信机制。通过详细的硬件配置、内存分配和核间通信实现步骤,展示了如何构建高效的双核Hello World系统,为嵌入式系统开发者提供了实用的开发指南和性能优化技巧。

weixin_29162439的博客 218

FHQ-Treap小记

写在前面 参考资料&&orz gyh 嘤 博主是在gyhgyhgyh大佬的博客的帮助下,学会了FHQ-Treap\text{FHQ-Treap}FHQ-Treap咋么写的,博文链接如下 Luckyblock—FHQ-Treap 感谢gyhgyhgyh大佬,gyhgyhgyh永远滴神! 另外的参考资料 Shiina_Mashiro—平衡树(Splay、fhq Treap) ctjcalc—【数据结构】FHQ Treap 详解 关于 FHQ-Treap\text{FHQ-Treap}FHQ-Tr

Loceaner的博客 3185

2025-E题国一-简易自行瞄准装置:基于嘉立创地猛星/天猛星与K230的视觉巡线云台系统设计

本文详细介绍了2025年全国大学生电子设计竞赛E题一等奖作品——基于嘉立创地猛星/天猛星与K230的视觉巡线云台系统设计。该系统通过地猛星主控实现小车巡线,天猛星主控驱动云台,结合K230开发板的视觉识别能力,构建了一套完整的视觉巡线云台系统,实现了自动巡线与精准瞄准功能。文章深入剖析了硬件选型、双闭环PID控制算法、视觉识别与目标跟踪等核心技术,并分享了系统调试与避坑经验。

weixin_42596011的博客 674

python调用海康工业相机并用opencv显示(整体实现)

python语言调用海康机器人(hikrobotics)工业相机 第一章 Python 语言下连接海康工业相机,并获取数据 文章目录 系列文章目录 前言 目录 python语言调用海康机器人(hikrobotics)工业相机 文章目录 前言 一、底层接口的准备 二、使用步骤 1.引入库 2.枚举设备 3.判断设备类型 4.输入连接设备 5.创建相机实例并创建句柄 6.打开设备 7.获取相关参数 8.主动获取图像 9.开启取流并获取每张.

qq_39570716的博客 5万+

fhq-treap简介

\(fhq-treap\)是个好东西啊!无旋转\(treap\)果然是好写,而且还是比较好理解的。 这种数据结构是由神犇fhq发明的。\(Think\ functional!\) fhq神犇说,函数式编程的一大特点就是,不修改,只定义。普通的平衡树,无论是treap还是splay,都需要进行旋转来维护树的平衡性。 fhq神犇是通过可持久化线段树引入的。主席树其实就是一种函数式编程的产物。主席树中没...

weixin_30411819的博客 699

从零到一:用MSC Nastran Patran搞定悬臂翼颤振分析(附完整模型文件)

本文详细介绍了使用MSC Nastran和Patran进行悬臂翼颤振分析的完整流程,从几何建模、网格划分到模态分析和颤振求解。通过具体案例讲解关键参数设置和操作技巧,帮助工程师掌握气动弹性分析的核心方法,并附赠完整模型文件供实践参考。

weixin_42563415的博客 440

无旋Treap——FHQ Treap

FHQ Treap

Lucas_FC_的博客 948

别怕,“卷积”其实很简单

首先给大家讲一个关于卷积的小故事:小明是杭州某互联网大厂的员工,每天996十分辛苦,但小明最近爱上了打台球,经常不在工位。这天,小明的主管让小明改一个需求,小明却到楼下找产品部小丽打台球去了,被主管发现,他非常气愤,扇了小明一巴掌(注意,这就是输入信号,脉冲)。于是小明脸上会渐渐地(贱贱地)鼓起来一个包,小明的脸就是一个系统,而鼓起来的包就是小明的脸对巴掌的响应。好,这样就和信号系统建立起来意义对应的联系。

Machine Learning with Tutors 3181

跟着团子学SAP PS:BOM和项目结构的联动-BOM Transfer CN33

关于项目中的物料组件挂接你需要了解的一点功能

Lucas1211的博客 2万+

浅析FHQ-treap

FHQ-treap是一种不用旋转的平衡树,它的平衡由分裂合并保证。好写,能可持久化,可以序列操作,都是它的特点

fushcsdn的博客 1453

基于STM32开发板的USB MIDI键盘实现

在本文中,我们介绍了如何使用STM32开发板和相应的软件工具来实现USB MIDI键盘。通过配置STM32CubeMX和编写相应的源代码,我们能够将STM32开发板转换为一个功能齐全的USB MIDI设备。我们将使用STM32开发板和相应的软件工具来实现这一功能,并提供相应的源代码供参考。此时,您应该可以使用STM32开发板作为USB MIDI键盘,并在按键按下时听到相应的音符。在STM32CubeMX中,选择适当的STM32型号,并启动一个新的项目。然后,将生成的可执行文件烧录到STM32开发板中。

2301_79326616的博客 1588

【数据结构】FHQ Treap详解

FHQ Treap是什么? FHQ Treap,又名无旋Treap,是一种不需要旋转的平衡树,是范浩强基于Treap发明的。FHQ Treap具有代码短,易理解,速度快的优点。(当然跟红黑树比一下就是……)至少它在OI中算是很优秀的数据结构了。 前置知识: C++ 二叉搜索树的基本性质,下面会讲 二叉堆 二叉搜索树的基本性质 很简单,就这几个。 在二叉搜索树中,每个结点都满足左...

聚娃科技开发者博客 1497

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

FHQ-Treap学习笔记

无(乐)

Tong__2008的博客 983

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

fhq treap入门

目录一.前言二.原理三.具体实现模板题目一.洛谷P3369:普通平衡树二.洛谷P3391 文艺平衡树 一.前言 这个数据结构早有耳闻.只是一直没学.跟着AgOH学了一波.发现很简单. 二.原理 二叉搜索树之所以不够优秀,是因为存在一些数据能够将二叉搜索树退化成一条链.从而导致平方级的复杂度.那么对于这个缺陷,大佬们想出了很多方法去解决,衍生出了①替罪羊树②有旋/无旋Treap③splay.今天我入门学习的就是无旋treap. Treap之所以能够克服二叉搜索树的缺陷,主要因为它以随机的方式构造二叉搜索树.使

qq_35577488的博客 953

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Fhq_Treap

总结

Mouse_liang的博客 1000

FHQ Treap 总结

【前言(一堆废话)】 目前 OI 竞赛中两大主流平衡树之一就是 FHQ Treap(另一个是 Splay)。 普通 BST 的中序遍历中,val 值构成一个单调递增的序列。 Treap 在 BST 的基础上,维护了一个 key 值,使其 val 满足 BST 性质,key 满足 Heap 性质。在维护 Heap 性质的同时,使 Treap 的树高期望是 log(n)。通常情况下,key 值是...

又又大柚纸的博客 6707

【平衡树】FHQ-Treap讲解

FHQ-Treap

abs20187的博客 1102

FHQ_Treap 基础

FHQ_Treap 基础一, 原理介绍二,关键操作1,节点创建:create2,节点复制(不仅仅是权值):copy3,上传:up4,下传:down5,分裂子树:split6,合并子树:merge AGOH B站讲解,三分钟入门,1天熟练,2天持久化 可持久化讲解博客: KevinYu 随机化的修改与玄学骗分 https://www.luogu.com.cn/blog/xing4c/post-fei-xuan-ping-heng-shu-fhq-treap 一, 原理介绍 免旋,保存原结构的基础上进行增删,

qq_42852687的博客 658

浅谈无旋treap(fhq_treap)

一、简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树。 无旋Treap是一个叫做范浩强的大佬发明的(快%啊!) 在我们一起学习无旋Treap之前,本蒟蒻有几句活想说: 1.无旋Treap我个人认为是最容易理解的一种平衡树,而且编程复杂度不高,功能还那么强大。 ...

aaa3201的博客 1646

无旋Treap——FHQ-Treap详解

FHQ-treap——无旋treap 前置知识: 二叉排序树 treap 了解什么是函数式编程 引入 “平衡树好烦啊,转来转去的,而且treap遇到区间序列问题就gg。” “有一种不用旋转的treap,叫FHQ-treap,可以解决区间序列问题。” 正文 约定 我们做出以下约定: int ch[MAXN][3];//0 左孩子,1右孩子 int val[MAXN];//每个点的权值 int rnd[MAXN];//每个点的随机权值 int size[MAXN];//以每个点为根的树的大小

Andysun06的博客 937

【模板】FHQ Treap

FHQ Treap,可持久化

lsy_41的博客 192

fhq_treap 小结

简介 \(fhq\_treap\)是一种非旋平衡树。在学习这篇文章之前,还是先学习一下普通\(treap\)吧 优点 相比于普通的\(treap\),它可以处理区间操作。 相比于\(splay\),它简洁易懂,代码也较短。 缺点 要比\(splay\)和\(treap\)慢 基础操作 \(fhq\_treap\)最基本的两个操作就是分裂和合并。 分裂 即把一个\(treap\)分为两个。...

diecimu4798的博客 245

[学习笔记]fhq Treap

1、引入 前置知识:堆(不需要会Treap,或者说根本不用会Treap) 我发现目前用Splay的题目都可以用fhq(不排除我见识短浅的可能) 主要两个特点: 整棵树满足二叉搜索树性质:左儿子小于自己,右儿子大于自己 整棵树满足堆的性质:每个点附带一个值keykeykey,值为随机,以key满足堆(可以默认大根堆) 2、操作 新开一个节点 int addnode(int x){ ++s...

ModestCoder_的博客 682

Treap + FHQ Treap

一:Treap 支持:插入、删除、查询 xxx 的排名、查询排名为 xxx 的数、查前驱、查后继、左旋右旋 模板题:P3369 【模板】普通平衡树 #include<bits/stdc++.h> #define rint register int #define deb(x) cerr<<#x<<" = "<<(x)<<'\n'; using namespace std; typedef long long ll; typedef pair &lt

Scar_Halo 334
上一篇: Manacher马拉车
下一篇: Grid Rotations
Binary_Master
博客等级 码龄1年 35粉丝 11原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值