如题,这是一个模板。。。

 #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的更多相关文章

  1. 模板 - 无旋Treap

    一般而言作为一棵平衡树只需要插入,删除,值求排名,排名求值,前驱,后继,六个接口. #include<bits/stdc++.h> using namespace std; typedef ...

  2. [模板] 无旋Treap (C++ class)

    注意!本帖不是算法介绍!只是贴代码(逃) //嫌stdlib的rand太慢,手打了一个 /* Author: hotwords */ typedef unsigned int tkey; class ...

  3. 模板——无旋Treap

    #include "bits/stdc++.h" using namespace std; inline int read(){ ,k=;char ch=getchar(); :, ...

  4. 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)

    原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...

  5. [模板] 平衡树: Splay, 非旋Treap, 替罪羊树

    简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...

  6. 无旋treap的简单思想以及模板

    因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...

  7. 模板 - 数据结构 - 可持久化无旋Treap/PersistentFHQTreap

    有可能当树中有键值相同的节点时,貌似是要对Split和Merge均进行复制的,本人实测:只在Split的时候复制得到了一个WA,但只在Merge的时候复制还是AC,可能是恰好又躲过去了.有人说假如确保 ...

  8. 洛谷 - P3391 【模板】文艺平衡树(Splay) - 无旋Treap

    https://www.luogu.org/problem/P3391 使用无旋Treap维护序列,注意的是按顺序插入的序列,所以Insert实际上简化成直接root和Merge合并,但是假如要在序列 ...

  9. 非旋 treap 结构体数组版(无指针)详解,有图有真相

    非旋  $treap$ (FHQ treap)的简单入门 前置技能 建议在掌握普通 treap 以及 左偏堆(也就是可并堆)食用本blog 原理 以随机数维护平衡,使树高期望为logn级别, FHQ  ...

  10. 2018.08.27 rollcall(非旋treap)

    描述 初始有一个空集,依次插入N个数Ai.有M次询问Bj,表示询问第Bj个数加入集合后的排名为j的数是多少 输入 第一行是两个整数N,M 接下来一行有N个整数,Ai 接下来一行有M个整数Bj,保证数据 ...

随机推荐

  1. HDMI和VGA接口

    HDMI英文全称为:High Definition Multimedia Interface,它是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号. HDMI接口与VGA接口区别如下: ...

  2. vue之webpack打包工具的使用

    vue之webpack打包工具的使用 一.什么是webpack? webpack是一个模块打包工具.用vue项目来举例:浏览器它是只认识js,不认识vue的.而我们写的代码后缀大多是.vue的,在每个 ...

  3. Django-Rest-Framework的视图和路由

    Django-Rest-Framework的视图和路由  restful framework  Django-Rest-Framework的视图 APIView django中写CBV的时候继承的是V ...

  4. Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) D

    Country of Metropolia is holding Olympiad of Metrpolises soon. It mean that all jury members of the ...

  5. JS——变量声明、变量类型、命名规范

    变量声明: JavaScript是一种弱类型语言,它的变量类型由它的值来决定,var是变量声明. 变量类型: 基本类型:number.string.boolean(布尔类型:var a=true/fa ...

  6. replcation set (复制集)配置过程 --mongodb

    一,配置规划 复制集原理(基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB)  Paxos(mysql MGR 用的是变种))如果发生主库宕机,复制集内部会进行投票选举,选择一 ...

  7. 《从0到1学习Flink》—— Flink 配置文件详解

    前面文章我们已经知道 Flink 是什么东西了,安装好 Flink 后,我们再来看下安装路径下的配置文件吧. 安装目录下主要有 flink-conf.yaml 配置.日志的配置文件.zk 配置.Fli ...

  8. mysql通过sql语句判断某个字段在一张表中是否存在

    应用场景: 我有一张表,表里面都是用户用来激活游戏的激活码,当用户在前端页面输入激活码时,要查询数据表中是否有这条激活码,如果有就返回"1",没有则返回"0". ...

  9. plsql过期注册

    Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number:601769password:xs374ca 打开plsql工具 点击注册即可

  10. c#进行MD5加密方式和解密算法

    --------------- 因为加密个解密都需要用到key所有在加密的后需要把key和加密码都存到数据库中 /// <summary> /// 唯一加密方式 /// </summ ...