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

 #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 seed = ;
int m, x, tot, opt, rt = ;
int siz[MAXN], val[MAXN], rnd[MAXN], son[MAXN][]; inline int Rand()
{
return seed = (int)seed * 482711LL % ;
} inline void Pushup(int u)
{
siz[u] = siz[son[u][]] + siz[son[u][]] + ;
} inline int New(int x)
{
siz[++tot] = ;
val[tot] = x;
rnd[tot] = Rand();
son[tot][] = son[tot][] = ;
return tot;
} inline void Split(int u, int x, int &a, int &b)
{
if (!u) { a = b = ; return; }
if (val[u] <= x) a = u, Split(son[u][], x, son[a][], b);
else b = u, Split(son[u][], x, a, son[b][]);
Pushup(u);
} inline void Split_siz(int u, int k, int &a, int &b)
{
if (!u) { a = b = ; return; }
if (k <= siz[son[u][]]) b = u, Split_siz(son[u][], k, a, son[b][]);
else a = u, Split_siz(son[u][], k - siz[son[u][]] - , son[a][], b);
Pushup(u);
} inline void Merge(int & u, int a, int b)
{
if (!a || !b) { u = a | b; return; }
if (rnd[a] < rnd[b]) u = a, Merge(son[u][], son[a][], b);
else u = b, Merge(son[u][], a, son[b][]);
Pushup(u);
} inline int Findkth(int u, int k)
{
while (siz[son[u][]] + != k)
if (siz[son[u][]] >= k) u = son[u][];
else k -= siz[son[u][]] + , u = son[u][];
return u;
} inline void Insert(int x)
{
int a = , b = , c = ;
c = New(x);
Split(rt, x, a, b);
Merge(a, a, c);
Merge(rt, a, b);
} inline void Delete(int x)
{
int a = , b = , c = ;
Split(rt, x, a, b);
Split(a, x - , a, c);
Merge(c, son[c][], son[c][]);
Merge(a, a, c);
Merge(rt, a, b);
} inline void Getrank(int x)
{
int a = , b = ;
Split(rt, x - , a, b);
printf("%d\n", siz[a] + );
Merge(rt, a, b);
} inline void Getkth(int k)
{
int a = , b = , c = ;
//·½·¨1£ºÓú¯ÊýÄõÚk´ó
printf("%d\n", val[Findkth(rt, k)]);
return; //·½·¨2£º°´siz·ÖÁÑÄóöc
Split_siz(rt, k, a, b);
Split_siz(a, k - , a, c);
printf("%d\n", val[c]);
Merge(a, a, c);
Merge(rt, a, b);
} inline void Pre(int x)
{
int a = , b = ;
Split(rt, x - , a, b);
printf("%d\n", val[Findkth(a, siz[a])]);
Merge(rt, a, b);
} inline void Suf(int x)
{
int a = , b = ;
Split(rt, x, a, b);
printf("%d\n", val[Findkth(b, )]);
Merge(rt, a, b);
} signed main()
{
read(m);
for (int i = ; i <= m; ++i)
{
read(opt), read(x);
if (opt == ) Insert(x);
if (opt == ) Delete(x);
if (opt == ) Getrank(x);
if (opt == ) Getkth(x);
if (opt == ) Pre(x);
if (opt == ) Suf(x);
}
return ;
}

【模板】无旋Treap(FHQ)的更多相关文章

  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. fhq Treap(无旋Treap)

    先吹一波fhq dalao,竟然和我一个姓,我真是给他丢脸. 昨天treap就搞了一下午,感觉自己弱爆了.然后今天上午又看了一个上午的无旋treap再次懵逼,我太弱了,orzorz. 所以写个博客防止 ...

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

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

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

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

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

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

  8. Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...

  9. HNOI2012 永无乡 无旋Treap

    题目描述 永无乡包含 nnn 座岛,编号从 111 到 nnn ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 nnn 座岛排名,名次用 111 到 nnn 来表示.某些岛之间由巨大的桥连接, ...

  10. 浅谈无旋treap(fhq_treap)

    一.简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树. 无旋Treap是一个叫 ...

随机推荐

  1. centOS7.5上部署server jre1.8.0_192 tomcat-8.5.35 mysql-8.0.13

  2. HDU-1827-Summer Holiday(强连通分量,贪心)

    链接:https://vjudge.net/problem/HDU-1827 题意: 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所 ...

  3. js:常用到的js操作记录

    1:对参数去除空格 str.replace(/^\s+|\s+$/g, '');

  4. 无线网路由器的dBm值

    首先,我们需要知道的是无线信号 dbm都是负数,最大是0:dbm值只在一种情况下为0,那就是在理想状态下经过实验测量的结果,一般我们认为 dbm为0是其最大值,意味着接收方把发射方发射的所有无线信号都 ...

  5. kindeditor编辑器和图片上传独立分开的配置细节

    关于kindeditor编辑器上传按钮的异步加载最关键的部署问题,它的上传图片的组件都已经封装得很好了的,只需要监听到页面按钮的点击事件给编辑器对象传递一些对应的初始化参数即可显示图片上传的弹窗实现异 ...

  6. ruby 从命令行读取文本

    最常见的方式就是使用内置的get 方法,这个方法可以从命令行读取用户的输入,并在默认的情况下把读入的文本赋值给预定义变量$_. 但是get方法会保留用户在输入字符串末尾所加的换行符,当用户在输入的字符 ...

  7. spring4、hibernate4整合xml配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  8. JavaScirpt 的垃圾(garbage collection)回收机制

    一.垃圾回收机制—GC Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存. 原理:垃圾收集器会定期(周期性 ...

  9. HBase数据模型(2)

    HBase数据模型(1) HBase数据模型(2) 1.0 HBase的版本version,是一个用长整型表示的.由Rowkey.Column(列族和列).Version组合在一起称为HBase中的一 ...

  10. Java中super关键字的作用与用法

    Java中的super是什么?java中的super关键字是一个引用变量,用于引用父类对象.关键字“super”以继承的概念出现在类中.主要用于以下情况: 1.使用super与变量:当派生类和基类具有 ...