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

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. php coding中的一些小问题

    最近在SAE上写微博应用,碰到一些小问题,记下来,以供参考: 1.出错提示: Fatal error: Can't use function return value in write context ...

  2. 人脸姿态校正算法 附完整C++示例代码

    在一些特殊情况下,经常需要依据图像中的人脸,对图片进行倾斜矫正. 例如拍照角度幅度过大之类的情况,而进行人工矫正确实很叫人头大. 那是不是可以有一种算法,可以根据人脸的信息对图片进行角度的修复呢? 答 ...

  3. c# 语法要点速览

    C# 变量类型 sbyte byte short ushort int uint long ulong float double decimal char bool string switch 默认不 ...

  4. 常用域名记录解释:A记录、MX记录、CNAME记录、TXT记录、AAAA记录、NS记录

    A记录 A记录是用来创建到IP地址的记录. A记录设置技巧 1.如果想创建不带www的记录,即ezloo.com,在主机记录中填写@或者留空,不同的注册商可能不一样. 2.创建多个域名到同一个IP,比 ...

  5. 关于css盒模型

    在css中,width和height指的是内容区域的宽度和高度.增加内边距,边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸.假设框的每个边上有10个像素的外边距和5像素的内边距,如果希望 ...

  6. 登录测试用例sql语句注入

    利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...

  7. Mysql访问权限问题:Access denied for user 'root'@'XXX' (using password: YES)

    System.Data.Entity.Core.ProviderIncompatibleException: An error occurred accessing the database. Thi ...

  8. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (二)

    上次讲解了FairyGUI的最简单的热更新办法,并对其中一个Demo进行了修改并做成了热更新的方式. 这次我们来一个更加复杂一些的情况:Emoji. FairyGUI的   Example 04 - ...

  9. scrapy中 Mongo的存储

    import pymongo MONGO_HOST = 'localhost' MONGO_PORT = 27017 MONGO_DB = 'today' MONGO_COLL = 'mm' clas ...

  10. spring+jotm+ibatis+mysql实现JTA分布式事务

    1 环境 1.1 软件环境  spring-framework-2.5.6.SEC01-with-dependencies.zip ibatis-2.3.4 ow2-jotm-dist-2.1.4-b ...