用 fhq_Treap 实现可持久化平衡树
支持对历史版本进行操作的平衡树
Treap 和 Splay 都是旋来旋去的
这样平衡树可持久化听起来不太好搞?
还有 fhq_Treap !
每次涉及操作就复制一个节点出来
操作历史版本就继承它的根继续往下搞
在 Split 和 Merge 里加上有关可持久化的操作即可
这里因为写了根据权值来分割的 Split
所以就写比较传统的 getrank 了 = =
所以其他的一些涉及 Split 的操作都改了改
其实还是挺好写的
终于还是写了传引用的 Split
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cstdio>
#include<cmath>
#include<ctime>
#define lson t[cur].ch[0]
#define rson t[cur].ch[1]
using namespace std; const int MAXN = 500001, inf = 0x7fffffff; struct Node{
int ch[2], siz, val, prio;
Node(){ch[0] = ch[1] = siz = val = 0;}
}t[MAXN * 50];
int Root[MAXN], n, poolcur; inline int rd() {
register int x = 0;
register char c = getchar();
register bool f = false;
while(!isdigit(c)) {
if(c == '-') f = true;
c = getchar();
}
while(isdigit(c)) {
x = x * 10 + c - 48;
c = getchar();
}
return f ? -x : x;
}
inline int newnode(int val) {
register int cur = ++poolcur;
t[cur].siz = 1;
t[cur].prio = rand();
t[cur].val = val;
return cur;
}
inline void pushup(int cur) {
t[cur].siz = t[lson].siz + t[rson].siz + 1;
return;
}
void Split(int cur, int val, int &x, int &y) {
if(!cur) x = y = 0;
else {
if(t[cur].val <= val) {
x = ++poolcur; t[x] = t[cur];
Split(t[x].ch[1], val, t[x].ch[1], y);
pushup(x);
} else {
y = ++poolcur; t[y] = t[cur];
Split(t[y].ch[0], val, x, t[y].ch[0]);
pushup(y);
}
}
return;
}
int Merge(int x, int y) {
if(!x) return y; if(!y) return x;
if(t[x].prio < t[y].prio) {
int nw = ++poolcur; t[nw] = t[x];
t[x].ch[1] = Merge(t[x].ch[1], y);
pushup(x);
return x;
} else {
int nw = ++poolcur; t[nw] = t[y];
t[y].ch[0] = Merge(x, t[y].ch[0]);
pushup(y);
return y;
}
}
void Insert(int &root, int val) {
int x, y;
Split(root, val, x, y);
root = Merge(Merge(x, newnode(val)), y);
return;
}
void Remove(int &root, int val) {
int x, y, z;
Split(root, val, x, z);
Split(x, val - 1, x, y);
y = Merge(t[y].ch[0], t[y].ch[1]);
root = Merge(Merge(x, y), z);
return;
}
int getrnk(int &root, int val) {
int x, y;
Split(root, val - 1, x, y);
int ans = t[x].siz + 1;
root = Merge(x, y);
return ans;
}
int findkth(int cur, int k) {
if(k <= t[lson].siz) return findkth(lson, k);
if(k == t[lson].siz + 1) return t[cur].val;
return findkth(rson, k - t[lson].siz - 1);
}
int getpre(int &root, int val) {
int x, y;
Split(root, val - 1, x, y);
if(!x) return -inf;
int k = t[x].siz;
int ans = findkth(x, k);
root = Merge(x, y);
return ans;
}
int getnxt(int &root, int val) {
int x, y;
Split(root, val, x, y);
if(!y) return inf;
int ans = findkth(y, 1);
root = Merge(x, y);
return ans;
} int main() {
srand(time(NULL));
n = rd();
int ver, opt, x;
for(int i = 1; i <= n; ++i) {
ver = rd(); opt = rd(); x = rd();
Root[i] = Root[ver];
switch(opt) {
case 1: Insert(Root[i], x); break;
case 2: Remove(Root[i], x); break;
case 3: printf("%d\n", getrnk(Root[i], x)); break;
case 4: printf("%d\n", findkth(Root[i], x)); break;
case 5: printf("%d\n", getpre(Root[i], x)); break;
case 6: printf("%d\n", getnxt(Root[i], x)); break;
}
}
return 0;
}
用 fhq_Treap 实现可持久化平衡树的更多相关文章
- [Luogu 3835]【模板】可持久化平衡树
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作 ...
- Luogu P3835 【模板】可持久化平衡树(fhq Treap)
P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本 ...
- 2021.07.02 P1383 高级打字机题解(可持久化平衡树)
2021.07.02 P1383 高级打字机题解(可持久化平衡树) 分析: 从可以不断撤销并且查询不算撤销这一骚操作可以肯定这是要咱建一棵可持久化的树(我也只会建可持久化的树,当然,还有可持久化并查集 ...
- 可持久化Trie & 可持久化平衡树 专题练习
[xsy1629]可持久化序列 - 可持久化平衡树 http://www.cnblogs.com/Sdchr/p/6258827.html [bzoj4260]REBXOR - Trie 事实上只是一 ...
- 洛谷P3835 【模板】可持久化平衡树
题目背景 本题为题目 普通平衡树 的可持久化加强版. 数据已经经过强化 感谢@Kelin 提供的一组hack数据 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作( ...
- P3835 【模板】可持久化平衡树
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的 ...
- 【LG3835】可持久化平衡树
[LG3835]可持久化平衡树 题面 洛谷 解法一 参考文章 rope大法好 \(rope\)基本操作: #include<ext/rope> using namespace __gnu_ ...
- [cogs2314][HZOI 2015] Persistable Editor - 可持久化平衡树
[cogs2314][HZOI 2015]Persistable Editor - 可持久化平衡树 题目链接 首先吐槽扯淡几句 [题目描述] 维护一种可持久化的文本编辑器,支持下列操作: 1 p st ...
- LG3835 【模板】可持久化平衡树
题意 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的排名 ...
随机推荐
- MTCNN人脸检测 附完整C++代码
人脸检测 识别一直是图像算法领域一个主流话题. 前年 SeetaFace 开源了人脸识别引擎,一度成为热门话题. 虽然后来SeetaFace 又放出来 2.0版本,但是,我说但是... 没有训练代码, ...
- Linux 库函数与系统调用的关系与区别
上周总结了<C 标准库的基础 IO>,其实这些功能函数通过「系统调用」也能实现相应功能.这次文章并不是要详细介绍各系统调用接口的使用方法,而是要深入理解「库函数」与「系统」调用之间的关系和 ...
- Java编程语言下Selenium驱动各个浏览器代码
这里采用的是Selenium3.7版本,首先介绍的是在Windows环境下运行的: 总结下注意事项: 1,设置各个浏览器的Driver路径 System.setProperty("" ...
- Linux 文件目录解释
/bin:bin是binary(二进制)的缩写.这个目录是对UNIX系统习惯的沿袭,存放着使用者最经常使用的命令.例如:cp,ls,cat. /boot:这里存放的是启动LINUX时使用的一些核心文件 ...
- [转]在Windows下编译ffmpeg完全手册
本文的内容几乎全部来自于FFmpeg on Windows,但是由于国内的网络封锁,很难访问这个域名下的内容,因此我一方面按照我自己的理解和实践做了翻译,另一方面也是为了能提供一个方便的参考方法. 注 ...
- Linux常用资源(不断改进中)
Linux常用命令全集: http://linux.chinaitlab.com/special/linuxcom/Index.html ubuntu 12.04 配置指南: http://www. ...
- JAVA中Sql时间格式与util时间格式转换
关于时间格式转化: java.util.Date 与 java.sql.Date 互换 sql是子类 字符串转化成java.util.Date SimpleDateFormat date =n ...
- Spring4托管Hibernate5并利用HibernateTemplate进行数据库操作
时隔半年,再次发布配置类的相关Blog,因为左手受伤原因先做一个简述. 首先利用idea创建一个Spring+SpringMVC+Hibernate项目,注意的是因为我们要完全放弃Hibernate以 ...
- C#之Redis所欲为
一 Redis是一种支持多种数据结构的键值对数据库 1.1Redis下载地址 :https://github.com/MicrosoftArchive/Redis 建议下载 .msi结尾的应用程序进行 ...
- Global一点小经验
Global: Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法,他位于应用程序根目录下. 这个 Global.asax ...