当前位置: 首页 > 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.vanclimg.com/news/1227.html

相关文章:

  • C#/.NET/.NET Core技术前沿周刊 | 第 48 期(2025年7.21-7.27)
  • Metasploit Pro 4.22.8-2025071801 (Linux, Windows) - 专业渗透测试框架
  • test的启动方法
  • Lombok @Builder失效问题排查与解决方案
  • 亚马逊Q Developer:用自然语言构建机器学习模型
  • day07
  • 读心与芯:我们与机器人的无限未来08计算思维
  • 前馈电容技术解析!
  • 7/29
  • js高级第一天
  • Git 小白极速入门笔记
  • Git课程讲义
  • sakuraFrp页面503
  • 企业级AI Agent(智能体)报告
  • 2025倒闭半导体公司大盘点
  • 大算力芯片,向左(定制)还是向右(通用)?
  • Z Waves|北大毕业的前OpenAI高管,如今创办估值120亿美金的AI新势力,翁荔想要重写AI安全的规则
  • Hyperlane性能调优秘籍:从毫秒级响应到百万QPS的优化之路(5845)
  • 轻量级服务器架构的极致优化(9293)
  • 高性能路由系统的设计与实现(2739)
  • TCP连接优化的实战经验(6269)
  • 实时通信技术深度对比:WebSocket与SSE的最佳实践(9733)
  • 现代Web框架的性能基准测试(8409)
  • 现代Web服务器性能革命:我的Rust框架探索之旅(1820)
  • 实战项目:文件分块上传系统(4936)
  • HTTP请求处理的高效封装(8307)
  • 实时通信的革命:WebSocket技术的深度探索(1440)
  • (阶段三:整合)面向用户 面向商户,场景之:shop
  • 在常量时间内实现单向链表的插入与删除
  • cpp的单头文件