支持对历史版本进行操作的平衡树

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 实现可持久化平衡树的更多相关文章

  1. [Luogu 3835]【模板】可持久化平衡树

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作 ...

  2. Luogu P3835 【模板】可持久化平衡树(fhq Treap)

    P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本 ...

  3. 2021.07.02 P1383 高级打字机题解(可持久化平衡树)

    2021.07.02 P1383 高级打字机题解(可持久化平衡树) 分析: 从可以不断撤销并且查询不算撤销这一骚操作可以肯定这是要咱建一棵可持久化的树(我也只会建可持久化的树,当然,还有可持久化并查集 ...

  4. 可持久化Trie & 可持久化平衡树 专题练习

    [xsy1629]可持久化序列 - 可持久化平衡树 http://www.cnblogs.com/Sdchr/p/6258827.html [bzoj4260]REBXOR - Trie 事实上只是一 ...

  5. 洛谷P3835 【模板】可持久化平衡树

    题目背景 本题为题目 普通平衡树 的可持久化加强版. 数据已经经过强化 感谢@Kelin 提供的一组hack数据 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作( ...

  6. P3835 【模板】可持久化平衡树

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的 ...

  7. 【LG3835】可持久化平衡树

    [LG3835]可持久化平衡树 题面 洛谷 解法一 参考文章 rope大法好 \(rope\)基本操作: #include<ext/rope> using namespace __gnu_ ...

  8. [cogs2314][HZOI 2015] Persistable Editor - 可持久化平衡树

    [cogs2314][HZOI 2015]Persistable Editor - 可持久化平衡树 题目链接 首先吐槽扯淡几句 [题目描述] 维护一种可持久化的文本编辑器,支持下列操作: 1 p st ...

  9. LG3835 【模板】可持久化平衡树

    题意 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的排名 ...

随机推荐

  1. SQLServer2PostgreSQL迁移过程中的几个问题

    1.PostgreSQL 跨平台迁移工具Migration Toolkit的使用指南:http://www.enterprisedb.com/docs/en/8.4/mtkguide/Table%20 ...

  2. 浅谈这个时代的SEO与网络营销

    1.大网站对分享内容的审核越来越严,高质量借道外链越来越难做. 2.大搜索引擎入口的权威性将会不断受各种方面的的削弱:比如自媒体.垂直服务网站等 3.旧路还没有短,但是新路要积极挖掘. 这也说的太少了 ...

  3. 利用Tess4J实现图片识别

    一.下载 1.进入官网下载页面 https://sourceforge.net/projects/tess4j/ 2.点击download 3.下载后解压,目录如下,圈出的三个文件夹是需要用到的 二. ...

  4. linux下安装apc

    wget htdtp://pecl.php.net/get/APC tar zxvf APC-3.1.3p.tgz cd APC-3.1.3p /usr/local/php/bin/phpize ./ ...

  5. Redis模块化基本介绍

    概要 Redis Modules System基本概念 基本应用 参考资料 1. Redis Modules System基本概念 Redis Modules System是4.0出现一大改动点,使得 ...

  6. Lenghth of Last Word

    description: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', ...

  7. vim编辑器常见命令归纳大全

    Esc:命令行模式 i:插入命令 a:附加命令 o:打开命令 c:修改命令 r:取代命令 s:替换命令 以上进入文本输入模式   : 进入末行模式 末行模式: w:保存 q:退出,没保存则无法退出 w ...

  8. Java单例模式(Singleton)以及实现

    一. 什么是单例模式 因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 二. 单例模式的特点 1. 单例模式只能有一个实例. 2. 单例类必须创建 ...

  9. udp服务端收发数据流程

    1.创建服务端的socket以便开始通讯.2.绑定ip以及端口号,这样客户端才能找到这个程序.3.因为本地网卡不止一个所以尽量不写死,一般用""空来表示所有本地网卡.4.接下来开始 ...

  10. 关于HTML5中的sessionStorage和localStorage

    需求: 做项目的时大多数情况下我们需要对请求的数据进行多次复用,为了降低请求次数我们需要对请求的数据进行本地存储: 以前用的cooking来存储为本地数据,HTML5后提出sessioStorage. ...