当前位置: 首页 > news >正文

FHQ Treap 学习笔记

前言

原来世上还有这么简短的平衡树……
——XiaoZi_qwq

参考资料:Konjac 的文章

正文

fhq Treap 的核心操作是 spiltmerge。其他的普通平衡树差不多

分裂

分裂有两种裂法:

  • 把权值小于等于 \(k\) 的分裂出去;

  • 把前 \(k\) 个分裂出去;

这里只展示后者:

void spilt(int i,int& x,int& y,int k){if(!i){x=y=0;return;}push_down(i);if(k>sz[ch[i][0]])x=i,spilt(ch[i][1],ch[x][1],y,k-sz[ch[i][0]]-1);elsey=i,spilt(ch[i][0],x,ch[y][0],k);push_up(i);
}

很优美qwq。

合并

和线段树合并差不多,只不过是在钦定返回哪个点是需要依靠随机值。合并是有顺序的,左边是权值小的,右边是权值大的。

int merge(int x,int y){if(!x || !y) return x+y;push_down(x),push_down(y);if(rd[x]<rd[y]){ch[x][1]=merge(ch[x][1],y);push_up(x);return x;}ch[y][0]=merge(x,ch[y][0]);push_up(y);return y;
}

插入,删除

  • 插入就是把权值小于插入点权值的点分裂出去,再按顺序合并起来;
  • 删除就是把权值小于删除点权值的点和权值大于删除点权值的点依次分裂出去,合并删除点左右儿子后,最后按顺序合并起来;

查前驱、后继、排名……

  • 查前驱就是把权值小于自己的点分裂出去,并在分裂出的树上一直跳右儿子;
  • 查后继就是把权值大于自己的点分裂出去,并在分裂出的树上一直跳左儿子;
  • 查排名就是把权值小于自己的点分裂出去,分裂出的树的大小加一就是排名;

区间操作

把这个区间对于的树分裂出来就行,操作完再按顺序合并回去就行。

void rev(int l,int r){int rt1,rt2,rt3,rt4;rt1=rt2=rt3=rt4=0;spilt(rt,rt1,rt2,l-1);spilt(rt2,rt3,rt4,r-l+1);upd(rt3);rt=merge(rt1,merge(rt3,rt4));
}
http://www.sczhlp.com/news/446.html

相关文章:

  • 20250729-33
  • Teamcenter: 度量单位
  • 关于在财务月结的标准事务码中获取执行结果的增强
  • .NET 9 的免费午餐:GZip 性能提升38.3%
  • cv2安装测试的一个案例-面部检测
  • gitlab重置管理员root密码
  • 线程API
  • 1000子读后感
  • 线程
  • 进程API函数
  • 进程
  • 〆250729〆Windows 系统中 C:\ProgramData 目录说明
  • .NET 10 中的新增功能系列文章1——运行时中的新增功能
  • CF2018D 题解
  • 区分引用变量和内表变量
  • Apple MagicKeyboard
  • 剑指offer-16、合并两个有序链表
  • 门店
  • 自定义控件----流动线条
  • 7.28总结
  • 2023年八大最佳Codecademy替代平台
  • 扩散模型-一张图片是一个概率分布采样的结果-94 - jack
  • 移远EC800K, EG800AK的 openSDK 编译
  • V-Ray 7 安装图解教程 | 支持3ds Max 2021-2026 含语言补丁配置
  • 2025暑假作业(7.28~8.3)
  • sed基础
  • 如果你还有一些困惑 / 请贴着我的心倾听 - Urd
  • 【IEEE出版】第五届计算机应用、视觉与算法国际学术会议(CVAA 2025)
  • 【SPIE出版】第二届生物医药和智能技术国际学术会议(ICBIT 2025)
  • 职业学院游戏发布