【模板】有旋Treap
如题,这是一个模板。。。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype> inline void read(int & x)
{
x = ;
int k = ;
char c = getchar();
while (!isdigit(c))
if (c == '-') c = getchar(), k = -;
else c = getchar();
while (isdigit(c))
x = (x << ) + (x << ) + (c ^ ),
c = getchar();
x *= k;
} const int MAXN = ;
int n, tot = , rt = ;
int cnt[MAXN], siz[MAXN], val[MAXN], rnd[MAXN];
int son[MAXN][]; inline int Rand(void)
{
static int seed = ;
return seed = (int)seed * 482711LL % ;
} inline void Pushup(int u)
{
siz[u] = siz[son[u][]] + siz[son[u][]] + cnt[u];
} inline void Rotate(int &u, int ch)
{
int b = son[u][ch ^ ];
son[u][ch ^ ] = son[b][ch];
son[b][ch] = u;
Pushup(u), Pushup(u = b);
} inline void Insert(int &u, int x)
{
if (!u)
{
u = ++tot;
cnt[u] = siz[u] = ;
val[u] = x, rnd[u] = Rand();
son[u][] = son[u][] = ;
return;
}
++siz[u];
if (val[u] == x) { ++cnt[u]; return; }
int ch = val[u] < x; Insert(son[u][ch], x);
if (rnd[u] > rnd[son[u][ch]]) Rotate(u, ch ^ );
} inline void Delete(int &u, int x)
{
if (!u) return;
if (val[u] == x)
{
if (cnt[u] > ) { --cnt[u], --siz[u]; return; }
int ch = rnd[son[u][]] < rnd[son[u][]];
if (!son[u][] || !son[u][]) u = son[u][] + son[u][];
else Rotate(u, ch), Delete(u, x);
}
else --siz[u], Delete(son[u][val[u] < x], x);
} inline int Getrank(int u, int x)
{
if (!u) return ;
if (val[u] == x) return siz[son[u][]] + ;
if (val[u] > x) return Getrank(son[u][], x);
else return Getrank(son[u][], x) + siz[son[u][]] + cnt[u];
} inline int Getkth(int k)
{
int u = rt;
while (true)
if (k <= siz[son[u][]]) u = son[u][];
else if (k > siz[son[u][]] + cnt[u])
k -= siz[son[u][]] + cnt[u], u = son[u][];
else return val[u];
} inline int Pre(int x)
{
int u = rt, pre = -;
while (u)
if (x > val[u]) pre = val[u], u = son[u][];
else u = son[u][];
return pre;
} inline int Suf(int x)
{
int u = rt, suf = ;
while (u)
if (x < val[u]) suf = val[u], u = son[u][];
else u = son[u][];
return suf;
} int opt, x; signed main()
{
read(n);
for (int i = ; i <= n; ++i)
{
read(opt), read(x);
if (opt == ) Insert(rt, x);
if (opt == ) Delete(rt, x);
if (opt == ) printf("%d\n", Getrank(rt, x));
if (opt == ) printf("%d\n", Getkth(x));
if (opt == ) printf("%d\n", Pre(x));
if (opt == ) printf("%d\n", Suf(x));
}
return ;
}
【模板】有旋Treap的更多相关文章
- 模板 - 无旋Treap
一般而言作为一棵平衡树只需要插入,删除,值求排名,排名求值,前驱,后继,六个接口. #include<bits/stdc++.h> using namespace std; typedef ...
- [模板] 无旋Treap (C++ class)
注意!本帖不是算法介绍!只是贴代码(逃) //嫌stdlib的rand太慢,手打了一个 /* Author: hotwords */ typedef unsigned int tkey; class ...
- 模板——无旋Treap
#include "bits/stdc++.h" using namespace std; inline int read(){ ,k=;char ch=getchar(); :, ...
- 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)
原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...
- [模板] 平衡树: Splay, 非旋Treap, 替罪羊树
简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...
- 无旋treap的简单思想以及模板
因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...
- 模板 - 数据结构 - 可持久化无旋Treap/PersistentFHQTreap
有可能当树中有键值相同的节点时,貌似是要对Split和Merge均进行复制的,本人实测:只在Split的时候复制得到了一个WA,但只在Merge的时候复制还是AC,可能是恰好又躲过去了.有人说假如确保 ...
- 洛谷 - P3391 【模板】文艺平衡树(Splay) - 无旋Treap
https://www.luogu.org/problem/P3391 使用无旋Treap维护序列,注意的是按顺序插入的序列,所以Insert实际上简化成直接root和Merge合并,但是假如要在序列 ...
- 非旋 treap 结构体数组版(无指针)详解,有图有真相
非旋 $treap$ (FHQ treap)的简单入门 前置技能 建议在掌握普通 treap 以及 左偏堆(也就是可并堆)食用本blog 原理 以随机数维护平衡,使树高期望为logn级别, FHQ ...
- 2018.08.27 rollcall(非旋treap)
描述 初始有一个空集,依次插入N个数Ai.有M次询问Bj,表示询问第Bj个数加入集合后的排名为j的数是多少 输入 第一行是两个整数N,M 接下来一行有N个整数,Ai 接下来一行有M个整数Bj,保证数据 ...
随机推荐
- Awesome Blockchain 区块链技术导航
区块链技术导航:收集整理最全面最优质的区块链(BlockChain)技术开发相关资源. 以后找不到文档资料的时候去导航站看看. 先亮个像,我长这样: 导航站内容 区块链开发所涉及的资源: 如 项目白皮 ...
- 【NOI2012】迷失游乐园
题目链接:迷失游乐园(BZOJ) 迷失游乐园(Luogu) 独立完成的题,写一发题解纪念一波~ 模拟完样例大概可以知道是道树形DP了. 观察数据范围,发现是基环树,至少会有一个环. 先从树的部分开始 ...
- 第九组 通信3班 063 OSPFv2与OSPFv3综合实验
实验目的 1. 掌握 OSPFv3(v2) 的配置方法 2. 掌握在帧中继环境下 OSPFv3 (v2)的配置方法 3. 掌握 OSPFv3(v2) NSSA 的配置方法 4. 掌握外部路由汇总的配置 ...
- shell学习(9)- du和df区别及详解
清明小长假来加班,总得干点啥吧,今天就说说du 和df的区别. 1.区别 du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,du能看到的文件只是一些当前存在的,没有删除的.他计算 ...
- nutzboot 使用nacos替换zookeeper
先放一段从网上拷贝一段分布式CAP理论的概念 分布式领域中存在CAP理论,且该理论已被证明:任何分布式系统只可同时满足两点,无法三者兼顾. ①C:Consistency,一致性,数据一致更新,所有数据 ...
- vue中params & query的比较
共同点: 1.都可以传值 2.在另外一个组件中传递值的时候,都是放在$route中 不同点: 1.传值时候,url的表现不一样 query /orderInfo?xxx=yyy&aaa=bbb ...
- MySQL表完整性约束
=======MySQL表完整性约束====== 目录: 一.介绍 二.not null 与 default 三.unique 四.primary key 五.auto_increment 六.for ...
- QDU-GZS and String
Description GZS has two strings s and t. In each step, GZS can select arbitrary character c of s and ...
- .NET Core使用NLog通过Kafka实现日志收集
微服务日志之.NET Core使用NLog通过Kafka实现日志收集 https://www.cnblogs.com/maxzhang1985/p/9522017.html 一.前言 NET Core ...
- 学习 primer 第8章 IO库 小结
iostream处理控制台IO fstream处理命名文件IO stringstream完成内存string的IO 非常重要!!!!!!!!!! ========================== ...