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

 #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. jsp学习与提高(三)——JSP Cookie 处理

    1.cookie是什么 Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息.在servlet技术基础上,JSP显然能够提供对HTTP cookie的支持. 通常有三个步骤来识别回头客: 服务 ...

  2. 【VueJS】sublime text3支持VueJS语法高亮显示插件vue-syntax-highlight

    1. sublime text3支持VueJS语法高亮显示插件vue-syntax-highlightgithub地址: https://github.com/vuejs/vue-syntax-hig ...

  3. bzoj3811 uoj36 玛里苟斯

    做题前问了一下miaom,得到了一个奇怪的回答 mmp 这题分类讨论 k=1sb题 k=2按位计算,把每个数看成几个2的幂次的和,按位跑期望 k>2线性基sb题 没了 #include<i ...

  4. (转)linux dumpe2fs命令

    linux dumpe2fs命令 命令名称 dumpe2fs - 显示ext2/ext3/ext4文件系统信息. dumpe2fs命令语法 dumpe2fs [ -bfhixV ] [ -o supe ...

  5. 牛客网Java刷题知识点之正则表达式(Matcher、Pattern)

    不多说,直接上干货! 正则表达式是什么? 正则表达式是一种可以用于模式匹配和替换的规范, 一个正则表达式就是由普通的字符(例如字符a到z) 以及特殊字符(元字符) 组成的文字模式, 它用以描述在查找文 ...

  6. Dev控件工具箱安装

    安装目录\Components\Tools,打开命令行 安装DEV工具 $ ToolboxCreator.exe /ini:toolboxcreator.ini 移除DEV工具 $ ToolboxCr ...

  7. JavaScript中的小陷阱(不定期更新。。)

    1. var scores = [1, 2, 3]; var total = 0; for (var score in scores) { total += score; } var mean = t ...

  8. js动态更换img的src问题

    在本地开发测试过程中,通过js动态更换img的src没有问题,图片正常切换,但是放在服务器上后测试发现,图片不显示,解决方法为:在对应onclick事件执行切换图片的js函数后加上一个return f ...

  9. feign hystrix加仪表盘

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  10. 浅析HTML的元素类型及其转换

    大家都知道html是由标签元素组成的,在了解元素的类型转换之前,让我们先来了解一下html的元素类型. 一.html元素类型分为两种:块级元素和内联元素,内联元素又被称为行内元素.  常见的块级元素有 ...