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

 #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. Kali Linux 工具清单

    Kali Linux 工具清单 Information Gathering acccheck ace-voip Amap Automater bing-ip2hosts braa CaseFile C ...

  2. NOIp知识集合 By cellur925

    基本算法 快速幂 ll ksm(ll a,ll b) { ll ans=; while(b) { ) ans=ans*a%p; b>>=; a=a*a%p; } return ans; } ...

  3. jQuery EasyUI/TopJUI创建树形表格下拉框

    jQuery EasyUI/TopJUI创建树形表格下拉框 第一种方法(纯HTML创建) <div class="topjui-row"> <div class= ...

  4. [BeiJing wc2012]连连看

    题目链接 费用流板子+拆点 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline int r ...

  5. 程序员/开发人员的真实生活 (Gif 多图)

    往工作环境上传东西的时候: 没保存,就关了 IDE 的时候: 凌晨三点调代码的时候: 正则表达式返回了了预期结果的时候: 当老板告诉我,我那一直负责的模块失效了的时候: 刚修复了Bug,我给老板演示的 ...

  6. HDU-2767-ProvingEquivalences

    链接:https://vjudge.net/problem/HDU-2767 题意: 给一个图,求最少需要几条边将其连成一个强连通图 思路: tarjan,缩点,考虑缩点后的图,出度为0的点和入度为0 ...

  7. 关于Memcache的连接

    addServer 在说Memcache的长连接(pconnect)和短连接(connect)之前要先说说Memcache的addServer,Memcache的addServer是增加一个服务器到连 ...

  8. c# 基础字符串

    ToLower():得到字符串的小写形式.注意字符串是不可变的,所以这些函数都不会直接改变字符串的内容,而是把修改后的字符串的值通过函数返回值的形式返回.s.ToLower()与s=s.ToLower ...

  9. storm中的topology-worker-executor-task

    调度角色 调度方法 自定义调度 1 调度角色   任务角色结构 上图是JStorm中一个topology对应的任务执行结构,其中worker是进程,executor对应于线程,task对应着spout ...

  10. JavaScript 事件对象event

    什么是事件对象? 比如当用户单击某个元素的时候,我们给这个元素注册的事件就会触发,该事件的本质就是一个函数,而该函数的形参接收一个event对象. 注:事件通常与函数结合使用,函数不会在事件发生前被执 ...