可持久化非旋转treap,真的是又好写又好调 ~

code:

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define N 500007
#define lson t[x].ls
#define rson t[x].rs
#define inf 2147483647
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int tot;
int cur;
int Pr;
int Nx;
int rt[N];
struct node {
int val;
int size;
int ls,rs;
int ran;
}t[N*50];
int newnode() {
++tot;
t[tot].val=0;
t[tot].size=1;
t[tot].ran=rand();
t[tot].ls=t[tot].rs=0;
return tot;
}
void pushup(int x) {
t[x].size=t[lson].size+t[rson].size+1;
}
void split(int x,int v,int &l,int &r) {
if(!x) {
l=r=0;
}
else {
int now=newnode();
t[now]=t[x];
if(t[x].val<=v) {
l=now;
split(rson,v,t[l].rs,r);
}
else {
r=now;
split(lson,v,l,t[r].ls);
}
pushup(now);
}
}
int merge(int x,int y) {
if(!x||!y) {
return x+y;
}
int now=newnode();
if(rand()%(x+y)<x) {
t[now]=t[x];
t[now].rs=merge(t[x].rs,y);
}
else {
t[now]=t[y];
t[now].ls=merge(x,t[y].ls);
}
pushup(now);
return now;
}
void Insert(int val) {
int x=0;
int y=0;
split(rt[cur],val,x,y);
int _new=newnode();
t[_new].val=val;
_new=merge(x,_new);
y=merge(_new,y);
rt[cur]=y;
}
void Delete(int val) {
int x=0;
int y=0;
int z=0;
split(rt[cur],val,x,z);
split(x,val-1,x,y);
if(y) {
y=merge(t[y].ls,t[y].rs);
}
y=merge(x,y);
z=merge(y,z);
rt[cur]=z;
}
int Rank(int val) {
int x=0;
int y=0;
split(rt[cur],val-1,x,y);
int re=t[x].size+1;
rt[cur]=merge(x,y);
return re;
}
void Pre(int x,int val) {
if(!x) {
return;
}
if(t[x].val<val) {
Pr=max(Pr,t[x].val);
Pre(rson,val);
}
else {
Pre(lson,val);
}
}
void Nxt(int x,int val) {
if(!x) {
return;
}
if(t[x].val>val) {
Nx=min(Nx,t[x].val);
Nxt(lson,val);
}
else {
Nxt(rson,val);
}
}
// 查询排名为 x 的数
int Num(int x,int kth) {
if(t[lson].size+1==kth) {
return t[x].val;
}
if(kth<=t[lson].size) {
return Num(lson,kth);
}
else {
return Num(rson,kth-t[lson].size-1);
}
}
int main() {
// setIO("input");
int i,j,m;
scanf("%d",&m);
for(cur=1;cur<=m;++cur) {
int v,opt,x;
scanf("%d%d%d",&v,&opt,&x);
rt[cur]=rt[v];
if(opt==1) {
Insert(x);
}
if(opt==2) {
Delete(x);
}
if(opt==3) {
printf("%d\n",Rank(x));
}
if(opt==4) {
printf("%d\n",Num(rt[cur],x));
}
if(opt==5) {
Pr=-inf;
Pre(rt[cur],x);
printf("%d\n",Pr);
}
if(opt==6) {
Nx=inf;
Nxt(rt[cur],x);
printf("%d\n",Nx);
}
}
return 0;
}

  

【洛谷P3835】 【模板】可持久化平衡树的更多相关文章

  1. 洛谷.3835.[模板]可持久化平衡树(fhq treap)

    题目链接 对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样).时间空间复杂度都为O(qlogq).(应该更大些 因为rand()?内存真的爆炸..) 对于无修改的操作实际上 ...

  2. 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]

    题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...

  3. 洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)

    题目链接 //离散化后范围1~cnt不要错 #include<cstdio> #include<cctype> #include<algorithm> //#def ...

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

    题目传送门:洛谷P3835. 题意简述: 题面说的很清楚了. 题解: 考虑建立一棵每个节点都表示一个版本的树. 以初始版本 \(0\) 为根.对于第 \(i\) 个操作,从 \(v_i\) 向 \(i ...

  5. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

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

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

  7. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

  8. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  9. luoguP3835 [模板]可持久化平衡树

    https://www.luogu.org/problemnew/show/P3835 因为博主精力和实力有限,学不懂 fhq treap 了,因此只介绍 leafy tree 解法 leafy tr ...

  10. 【AC自动机】洛谷三道模板题

    [题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...

随机推荐

  1. webpack系列--浅析webpack的原理

    一.前言 现在随着前端开发的复杂度和规模越来越大,鹰不能抛开工程化来独立开发,比如:react的jsx代码必须编译后才能在浏览器中使用,比如sass和less代码浏览器是不支持的.如果摒弃这些开发框架 ...

  2. c# 自动给版本升级,遇9变0且前面一个版本加1

    /// <summary> /// 版本辅助类 /// 创建人: /// 创建时间:2019-11-18 13:53:55 /// </summary> public clas ...

  3. HTML -------- 标签、元素、属性,

    HTMl 中的标签.元素.属性, one.标签 :HTML是由一套标记标签 (markup tag)组成,通常就叫标签 标签由开始标签和结束标签组成 <p> 这是一个开始标签 </p ...

  4. 【07】Jenkins:流水线(Pipeline)

    写在前面的话 个人认为 Pipeline 在 Jenkins 中算是一个优化性功能,它能够将我们的构建服务的整个过程流程化,这意味着当我们在执行到某一步的时候,可以添加询问,提示我们是否继续运行下一步 ...

  5. TransactionScope 使用的注意事项

    前两天为了给代码做一些事务封装,写了个小Demo,用TransactionScope代码块实现. 第一条更新成功后第二条刻意抛出异常,结果发现第一条总执行成功,这不符合预期,于是开始一步步跟踪调试. ...

  6. 用友U9 刷新当前页面代码

    this.Action.NavigateAction.Refresh(null, true);//刷新当前页

  7. Sql语句groupBY分组后取最新一条记录的SQL

    一.问题 groupBY分组后取最新一条记录的SQL的解决方案. 二.解决方案 select Message,EventTime from PT_ChildSysAlarms as a where E ...

  8. QQ互联,填写回调时注意事项

    今天在做QQ登录接口的时候,填写回调地址的时候,竟然出现了诡异的事情. 我的回调地址我直接填的域名,也申请通过了.但是在做开发地时候,一直提示这蛋疼的  redirect uri is illegal ...

  9. Nginx实现防盗链的方式

    一.ngx_http_referer_module(阻挡来源非法的域名请求),配置如下: location ~.*\. (gif|jpg|png|flv|swf|rar|zip)$ { valid_r ...

  10. 实验吧——认真一点(绕过空格,逗号,关键字过滤等 sql盲注)

    题目地址:http://ctf5.shiyanbar.com/web/earnest/index.php 过滤和拦截了某些东西,我经过多次尝试,最终构造的是 1'=(ascii(mid((select ...