【模板】有旋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,保证数据 ...
随机推荐
- appium desktop连接模拟器
1.adb准备好,我建议,下载Androidstudio,因为这样adb是最新的,可能会避免很多问题 2.adb connect 127.0.0.1:xxxx (网易mumu是7555,别的模拟器自行 ...
- ==和equals方法
Java程序中测试两个变量时否相等有两种方法: == 和 equals. ==判断 当使用==来判断两个变量是否相等时,如果两个变量是基本类型变量,且都是数字类型(不一定要求数据类型严格相同),则只要 ...
- CF920F SUM and REPLACE 线段树
给你一个数组a_i,D(x)为x的约数个数 两种操作: 1.将[l,r]的a_i替换为D(a_i) 2.输出∑a_i ( l <= i <= r ) 当区间最大值<=2时,就不 ...
- api接口测试工具和接口文档管理工具
api接口测试工具和接口文档管理工具 1.postman(https://www.getpostman.com) Postman 是一个很强大的 API调试.Http请求的工具.她可是允许用户发送任何 ...
- JavaSE---基本网络支持
1.Java为网络支持提供了java.net包,该包下的URL和URLConnection等类提供了 以编程方式访问WEB服务 的功能: 2.URLDecoder.URLEncoder提供了 普通字符 ...
- 看完这篇文章,我奶奶都懂了https的原理
本文在个人技术博客同步发布,详情可猛戳 亦可扫描屏幕右方二维码关注个人公众号 Http存在的问题 上过网的朋友都知道,网络是非常不安全的.尤其是公共场所很多免费的wifi,或许只是攻击者的一个诱饵 ...
- scp 可以在 2个 linux 主机间复制文件
Linux scp命令用于Linux之间复制文件和目录,具体如何使用这里好好介绍一下,从本地复制到远程.从远程复制到本地是两种使用方式.这里有具体举例: ================== Linu ...
- idea报错:Error running $classname: Command line is too long. Shorten command line for $classname.
Command line is too long 打印的变量太长了,超过了限制,这都会报错...我只想知道idea基于什么原理会报这个错... 解决 1.按照提示修改该类的配置,选择jar manif ...
- 常用的http网页错误代码表---------495引发的一个简单到爆,但基于国内环境只能呵呵呵的血案
敲代码敲出了个网页错误代码 495. 然后,正常的跑去百度,看了一堆还是没有完整的网页错误代码,应该说国内的环境的网页错误代码表只有官方的那几个,那么只能FQ了. 去到谷歌,一查全是俄语,乐了,明白是 ...
- js监听页面的scroll事件,当移到底部时触发事件
//页面拉到底时自动加载更多 $(window).scroll(function(event){ var wScrollY = window.scrollY; // 当前滚动条位置 var wInne ...