【模板】有旋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,保证数据 ...
随机推荐
- Kali Linux 工具清单
Kali Linux 工具清单 Information Gathering acccheck ace-voip Amap Automater bing-ip2hosts braa CaseFile C ...
- NOIp知识集合 By cellur925
基本算法 快速幂 ll ksm(ll a,ll b) { ll ans=; while(b) { ) ans=ans*a%p; b>>=; a=a*a%p; } return ans; } ...
- jQuery EasyUI/TopJUI创建树形表格下拉框
jQuery EasyUI/TopJUI创建树形表格下拉框 第一种方法(纯HTML创建) <div class="topjui-row"> <div class= ...
- [BeiJing wc2012]连连看
题目链接 费用流板子+拆点 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline int r ...
- 程序员/开发人员的真实生活 (Gif 多图)
往工作环境上传东西的时候: 没保存,就关了 IDE 的时候: 凌晨三点调代码的时候: 正则表达式返回了了预期结果的时候: 当老板告诉我,我那一直负责的模块失效了的时候: 刚修复了Bug,我给老板演示的 ...
- HDU-2767-ProvingEquivalences
链接:https://vjudge.net/problem/HDU-2767 题意: 给一个图,求最少需要几条边将其连成一个强连通图 思路: tarjan,缩点,考虑缩点后的图,出度为0的点和入度为0 ...
- 关于Memcache的连接
addServer 在说Memcache的长连接(pconnect)和短连接(connect)之前要先说说Memcache的addServer,Memcache的addServer是增加一个服务器到连 ...
- c# 基础字符串
ToLower():得到字符串的小写形式.注意字符串是不可变的,所以这些函数都不会直接改变字符串的内容,而是把修改后的字符串的值通过函数返回值的形式返回.s.ToLower()与s=s.ToLower ...
- storm中的topology-worker-executor-task
调度角色 调度方法 自定义调度 1 调度角色 任务角色结构 上图是JStorm中一个topology对应的任务执行结构,其中worker是进程,executor对应于线程,task对应着spout ...
- JavaScript 事件对象event
什么是事件对象? 比如当用户单击某个元素的时候,我们给这个元素注册的事件就会触发,该事件的本质就是一个函数,而该函数的形参接收一个event对象. 注:事件通常与函数结合使用,函数不会在事件发生前被执 ...