【模板】无旋Treap(FHQ)
如题,这是一个模板。。。
#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)的更多相关文章
- 模板 - 无旋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(); :, ...
- fhq Treap(无旋Treap)
先吹一波fhq dalao,竟然和我一个姓,我真是给他丢脸. 昨天treap就搞了一下午,感觉自己弱爆了.然后今天上午又看了一个上午的无旋treap再次懵逼,我太弱了,orzorz. 所以写个博客防止 ...
- 无旋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合并,但是假如要在序列 ...
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- HNOI2012 永无乡 无旋Treap
题目描述 永无乡包含 nnn 座岛,编号从 111 到 nnn ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 nnn 座岛排名,名次用 111 到 nnn 来表示.某些岛之间由巨大的桥连接, ...
- 浅谈无旋treap(fhq_treap)
一.简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树. 无旋Treap是一个叫 ...
随机推荐
- STP-12-MST工作原理
MST将网络划分为一或多个区域.一个MST区域是一组以相同方式共同使用MST的交换机——除了其他特性外,它们运行相同数量的MST实例,并在这些实例上映射相同的VLAN集合. 例如,在下图中,工程师定义 ...
- 14.插入数据、复制数据--SQL
一.插入完整的行 要求指定表名和插入到新行中的值 INSERT INTO Customers ', 'Toy Land', '123 Any Street', 'New York', 'NY', ', ...
- Codeforces Round #565 (Div. 3) C. Lose it!
链接: https://codeforces.com/contest/1176/problem/C 题意: You are given an array a consisting of n integ ...
- 删除vi编辑产生的.swp文件(linux编辑文件没有退出时直接关闭程序产生的临时文件)
关于swp文件 使用vi,经常可以看到swp这个文件,那这个文件是怎么产生的呢,当你打开一个文件,vi就会生成这么一个.(filename)swp文件以备不测(不测下面讨论),如果你正常退出,那么这个 ...
- Jmeter4.0----编写测试脚本(5)
1.说明 以HTTP请求为例,和小伙伴门分享一下jmeter测试脚本的基本编写步骤 2.步骤说明 第一步:打开jmeter,更改测试计划名称为 Test batchSignForDir(修改计划名称, ...
- F. Clique in the Divisibility Graph DP
http://codeforces.com/contest/566/problem/F F. Clique in the Divisibility Graph time limit per test ...
- [HNOI 2012]三角形覆盖问题
Description 二维平面中,给定 N个等腰直角三角形(每个三角形的两条直角边分别 平行于坐标轴,斜边从左上到右下).我们用三个非负整数( x, y, d)来描 述这样一个三角形 ...
- java读取文件封装的一个类(有部分代码借鉴别人的)
package modbus.rtu.calc; import java.io.BufferedReader; import java.io.FileInputStream; import java. ...
- Linux命令-4类
一.系统管理与维护 1. pwd:print working directory 打印工作目录 2. cd: change directory 改变或进入路径 ● c ...
- ESP8266串口WiFi扩展板详解
产品简介 ESP8266串口WiFi扩展板是深圳四博智联科技有限公司开发的一款基于乐鑫ESP8266的超低功耗的UART-WiFi模块,兼容Arduino UNO.Mega等标准主板,可以方便地进行二 ...