写在前面
参考资料&&orz gyh
嘤
博主是在 g y h gyh gyh大佬的博客的帮助下,学会了 FHQ-Treap \text{FHQ-Treap} FHQ-Treap咋么写的,博文链接如下
感谢 g y h gyh gyh大佬, g y h gyh gyh永远滴神!
另外的参考资料
Shiina_Mashiro—平衡树(Splay、fhq Treap)
关于
FHQ-Treap \text{FHQ-Treap} FHQ-Treap,又名无旋 Treap \text{Treap} Treap,是一种不需要旋转的平衡树~~(废话!)~~,是由范浩强基于 Treap \text{Treap} Treap发明的,以分裂、合并为核心操作,有码量小、易理解的优势,其操作方式使它天生支持维护序列、可持久化等特性。
直接上操作和代码吧,暂时还没有写操作的原理,以后会补
操作
核心操作
分裂
分裂分为按值分裂和按大小分裂两种,下面给出的代码是按值分裂
void split(int rt, int val, int &x, int &y) {
if (!rt) {
x = y = 0; return; }
if (t[rt].val <= val) x = rt, split(t[rt].son[1], val, t[rt].son[1], y);
else y = rt, split(t[rt].son[0], val, x, t[rt].son[0]);
update(rt);
}
合并
int merge(int x, int y) {
if (!x || !y) return x + y;
if (t[x].ran < t[y].ran) {
t[x].son[1] = merge(t[x].son[1], y), update(x);
return x;
}
else {
t[y].son[0] = merge(x, t[y].son[0]), update