无旋Treap【模板】P3369
题目
详情见链接。
代码
#include<cstdio>
#include<iostream>
#define outd(x) printf("%d\n",x)
#define outld(x) printf("%lld\n", x)
#define ls(x) arr[x].child[0]
#define rs(x) arr[x].child[1]
inline int read_int()
{
char c;
int ret = , sgn = ;
do { c = getchar(); } while ((c < '' || c > '') && c != '-');
if (c == '-') sgn = -; else ret = c - '';
while ((c = getchar()) >= '' && c <= '') ret = ret * + (c - '');
return sgn * ret;
}
using namespace std; const int maxn = + ; struct node
{
int child[], size, value, key;
}arr[maxn];
int tot; //当前节点个数 inline void push_up(int index)
{
arr[index].size = arr[ls(index)].size + arr[rs(index)].size + ;
} void split(int root, int& x, int& y, int value) //x中的小于或等于value,y中的大于value
{
if (!root) { x = y = ; return; }
if (arr[root].value <= value) { x = root; split(rs(root), rs(x), y, value); }
else { y = root; split(ls(root), x, ls(y), value); }
push_up(root);
} void merge(int&root, int x, int y)
{
if (!x || !y) { root = x + y; return; } //其中一个为0,root等于另一个
if (arr[x].key < arr[y].key) { root = x; merge(rs(root), rs(x), y); }
else { root = y; merge(ls(root), x,ls(y)); }
push_up(root);
} inline void insert(int& root, int value)
{
int x = , y = , z = ++tot;
arr[z].value = value, arr[z].size = , arr[z].key = rand();
split(root, x, y, value);
merge(x, x, z);
merge(root, x, y);
} inline void erase(int& root, int value)
{
int x = , y = , z = ;
split(root, x, y, value);
split(x, x, z, value - ); //z中全是value
merge(z, ls(z), rs(z));
merge(x, x, z);
merge(root, x, y);
} inline int Kth_number(int root, int k)
{
while (arr[ls(root)].size + != k)
{
if (arr[ls(root)].size >= k) root = ls(root);
else { k -= (arr[ls(root)].size + ); root = rs(root); }
}
return arr[root].value;
} inline int Get_rank(int& root, int value)
{
int x = , y = ;
split(root, x, y, value - );
int res = arr[x].size + ;
merge(root, x, y);
return res;
} inline int Pre(int& root, int value)
{
int x = , y = ;
split(root, x, y, value - );
int res = Kth_number(x, arr[x].size);
merge(root, x, y); //merge回去
return res;
} inline int Suf(int& root, int value)
{
int x = , y = ;
split(root, x, y,value);
int res = Kth_number(y, );
merge(root, x, y);
return res;
} int n, op, root; int main()
{
srand();
n = read_int();
while (n--)
{
op = read_int();
if (op == ) insert(root, read_int());
if (op == ) erase(root, read_int());
if (op == ) outd(Get_rank(root, read_int()));
if (op == ) outd(Kth_number(root, read_int()));
if (op == ) outd(Pre(root, read_int()));
if (op == ) outd(Suf(root, read_int()));
} return ;
}
参考视频链接:https://www.bilibili.com/video/av46204315/?p=2
无旋Treap【模板】P3369的更多相关文章
- 无旋Treap模板
传送门 Code #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) # ...
- 无旋treap的简单思想以及模板
因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...
- 模板 - 数据结构 - 可持久化无旋Treap/PersistentFHQTreap
有可能当树中有键值相同的节点时,貌似是要对Split和Merge均进行复制的,本人实测:只在Split的时候复制得到了一个WA,但只在Merge的时候复制还是AC,可能是恰好又躲过去了.有人说假如确保 ...
- 模板 - 无旋Treap
一般而言作为一棵平衡树只需要插入,删除,值求排名,排名求值,前驱,后继,六个接口. #include<bits/stdc++.h> using namespace std; typedef ...
- 洛谷 - P3391 【模板】文艺平衡树(Splay) - 无旋Treap
https://www.luogu.org/problem/P3391 使用无旋Treap维护序列,注意的是按顺序插入的序列,所以Insert实际上简化成直接root和Merge合并,但是假如要在序列 ...
- 浅谈无旋treap(fhq_treap)
一.简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树. 无旋Treap是一个叫 ...
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- 【算法学习】Fhq-Treap(无旋Treap)
Treap——大名鼎鼎的随机二叉查找树,以优异的性能和简单的实现在OIer们中广泛流传. 这篇blog介绍一种不需要旋转操作来维护的Treap,即无旋Treap,也称Fhq-Treap. 它的巧妙之处 ...
- [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )
转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec Mem ...
- [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...
随机推荐
- imgAreaSelect插件
利用jquery的imgAreaSelect插件实现图片裁剪示例 将用户上传的图片进行裁剪再保存是现在web2.0应用中常常处理的工作,现在借助jquery的imgareaselect插件再配合PHP ...
- [转] 无监督特征学习——Unsupervised feature learning and deep learning
from:http://blog.csdn.net/abcjennifer/article/details/7804962 无监督学习近年来很热,先后应用于computer vision, audio ...
- Segment Tree Range Minimum Query.
int rangeMinQuery(int segTree[], int qlow, int qhigh, int low, int high, int pos) { if (qlow <= l ...
- 洛谷P3431 [POI2005]AUT-The Bus
P3431 [POI2005]AUT-The Bus 题目描述 The streets of Byte City form a regular, chessboardlike network - th ...
- 洛谷P2862 [USACO06JAN]把牛Corral the Cows
P2862 [USACO06JAN]把牛Corral the Cows 题目描述 Farmer John wishes to build a corral for his cows. Being fi ...
- JAVA编写的断点续传小程序
上了一周的课,今天终于可以休息了,太棒了,今天闲着无聊使用java语言写了一个断点续传的小程序来分享给大家, 首先要下载个用于网络请求的框架:我这里给出地址,是用的Apache的HttpClient: ...
- [Java]三大特性之封装
封装这个我们可以从字面上来理解,简单来说就是包装的意思,专业点就是信息隐藏. 是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可 ...
- Identity Service
Identity Service - 解析微软微服务架构eShopOnContainers(二) 接上一篇,众所周知一个网站的用户登录是非常重要,一站式的登录(SSO)也成了大家讨论的热点.微软在 ...
- 转 如何观察 undo Oracle DML语句回滚开销估算
https://searchdatabase.techtarget.com.cn/7-20392/ --use_urec 详细解读: select USED_UREC from v$transacti ...
- setTimeout的异步传输机制
setTimeout是异步的,在设置完setTimeout后,指定代码会在设定的时间后加入到任务队列,但并不是立即执行,js是单线程语言,所有的代码按顺序执行,即同步执行,同步执行的代码放在执行队列中 ...