【模板】可持久化Treap
洛谷3835
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#define ls (a[u].l)
#define rs (a[u].r)
#define R (root[Ver])
#define update(u) (a[u].size=a[a[u].l].size+a[a[u].r].size+1)
#define copy(x) (a[++tot]=a[x],a[x=tot].ver=Ver)
using namespace std;
int Ver,ver,Opt,Val,n,x,y,z,tot,root[];
struct treap{int l,r,val,rnd,size,ver;}a[];
inline void read(int &k){
k=; int f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
k*=f;
}
inline void put(int x){
if(x<) putchar('-'),x=-x;
char s[]; int k=,y=;
while(x>){
y=x; x/=;
s[++k]=y-x*+;
}
for (int i=k;i>=;i--) putchar(s[i]);
puts(y?"":"");
}
inline void newnode(int val){a[++tot]=(treap){,,val,rand(),,Ver};}
void split(int u,int k,int &x,int &y){
if(!k){x=; y=u; return;}
if(a[u].size==k){x=u; y=; return;}
if (a[u].ver<Ver) copy(u);
if(a[ls].size>=k) split(ls,k,x,ls),y=u;
else split(rs,k-a[ls].size-,rs,y),x=u;
update(u);
}
int merge(int x,int y){//x较小树,y较大树
if ((!x)||(!y)) return x+y;
if(a[x].rnd<a[y].rnd){if (a[x].ver<Ver) copy(x); a[x].r=merge(a[x].r,y); update(x); return x;}
else{if (a[y].ver<Ver) copy(y); a[y].l=merge(x,a[y].l); update(y); return y;}
}
int qrank(int u,int val){
if(!u) return ;
return a[u].val>=val?qrank(ls,val):qrank(rs,val)+a[ls].size+;
}
int qval(int u,int rank){
if(a[ls].size+==rank) return a[u].val;
return a[ls].size>=rank?qval(ls,rank):qval(rs,rank-a[ls].size-);
}
int main(){
srand(); a[root[]=tot=]=(treap){,,<<,-,,};
read(n);
for(Ver=;Ver<=n;Ver++){
read(ver); R=root[ver];
read(Opt); read(Val);
if(Opt==){split(R,qrank(R,Val),x,y); newnode(Val); R=merge(merge(x,tot),y);}//插入
if(Opt==){//删除
int tmp=qrank(R,Val);
if (qval(R,tmp+)!=Val) continue;
split(R,tmp,x,y); split(y,,z,y); R=merge(x,y);
}
if(Opt==) put(qrank(R,Val)+);//求x的排名
if(Opt==) put(qval(R,Val));//求排名为x的数
if(Opt==){//求x的前驱
int tmp=qrank(R,Val);
if(tmp) put(qval(R,tmp)); else puts("-2147483647");
}
if(Opt==){//求x的后继
int tmp=qrank(R,Val+);
if(tmp<a[R].size) put(qval(R,tmp+)); else puts("");
}
}
return ;
}
【模板】可持久化Treap的更多相关文章
- 【模板】可持久化文艺平衡树-可持久化treap
题目链接 题意 对于各个以往的历史版本实现以下操作: 在第 p 个数后插入数 x . 删除第 p 个数. 翻转区间 [l,r],例如原序列是 \(\{5,4,3,2,1\}\),翻转区间 [2,4] ...
- 可持久化Treap
终于写了一次可持久化Treap,做的是可持久化序列的模板题. Treap Treap=Tree+Heap,是一个随机化的数据结构.它的每个节点至少有两个关键字,一个是我们要存储的\(val\),一个是 ...
- UVALive 6145 Version Controlled IDE(可持久化treap、rope)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- BZOJ 3595: [Scoi2014]方伯伯的Oj SBT+可持久化Treap
3595: [Scoi2014]方伯伯的Oj Time Limit: 6 Sec Memory Limit: 256 MBSubmit: 102 Solved: 54[Submit][Status ...
- 高rong效chang的可持久化treap
很多人觉得可持久化treap很慢,但是事实上只是他们可持久化treap的写法不对.他们一般是用split和merge实现所有功能,但是这样会有许多不必要的分裂.其实我们可以用一种特殊的方式来实现插入和 ...
- Codeforces - 38G 可持久化Treap 区间操作
题意:\(n\)个人排队,每个人有重要度\(p\)和不要脸度\(c\),如果第\(i\)个人的重要度大于第\(i-1\)个人的重要度,那么他们之间可以交换,不要脸度-1,交换后先前的第\(i\)个人也 ...
- Codeforces - 675D 可持久化Treap 树形操作
题意:模拟二叉树的构造过程,给出\(n\)个节点,每次从根插入,小于当前节点转到左儿子,否则右儿子,输出第\([2,n]\)个节点的父亲的权值 直接手动模拟会被链式结构T掉 网上找了下发现二叉树的性质 ...
- 平衡树与可持久化treap
平衡树(二叉树) 线段树不支持插入or删除一个数于是平衡树产生了 常见平衡树:treap(比sbt慢,好写吧),SBT(快,比较好写,有些功能不支持),splay(特别慢,复杂度当做根号n来用,功能强 ...
- 脑洞大开加偏执人格——可持久化treap版的Link Cut Tree2
试了一下先上再下的Treap方式,很高兴,代码变短了,但是,跑的变慢了!!!其实慢得不多,5%左右.而且这个版本的写法不容易写错..只要会一般可持久化Treap的人写着都不难...就是相对于(压行的) ...
- 脑洞大开加偏执人格——可持久化treap版的Link Cut Tree
一直没有点动态树这个科技树,因为听说只能用Splay,用Treap的话多一个log.有一天脑洞大开,想到也许Treap也能从底向上Split.仔细思考了一下,发现翻转标记不好写,再仔细思考了一下,发现 ...
随机推荐
- BestCoder Round #59 (div.2) B. Reorder the Books 想法题
Reorder the Books 问题描述 dxy家收藏了一套书,这套书叫<SDOI故事集>,<SDOI故事集>有n(n\leq 19)n(n≤19)本,每本书有一个编号,从 ...
- java 四种实现延迟加载的方法
1. 延迟初始化 2. 虚拟代理(virtual proxy) 原文地址: http://www.oodesign.com/proxy-pattern.html Intent The intent ...
- ios3--UIView的常见方法
// // ViewController.m // 07-UIView的常见方法 // #import "ViewController.h" @interface ViewCont ...
- iOS-获取子视图父控制器
开发中有的时候需要涉及当前视图的父级视图,可以通过UIResponder来获取,有两种实现方式: UIView *next=sender; while ([next superview]) { nex ...
- luoguP2939 [USACO09FEB]改造路Revamping Trails
约翰一共有N)个牧场.由M条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场1出发到牧场N去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰打算升级其中K条小径,使之成为高 速公路. ...
- unsigned 赋值负数输出情况 & printf输出格式
%d 有符号10进制整数 %ld 长整型 %hd短整型 %i 有符号10进制整数 %o 无符号8进制整数 %u 无符号10进制整数 %x 无符号的16进制数字,并以小写abcdef表示 %X 无符号的 ...
- vuejs 中如何优雅的获取 Input 值
http://www.sunzhongwei.com/how-to-get-input-value-in-vuejs
- akka设计模式系列-消息模型
通过前面的文章我们总结了几个常见的actor设计模式,但此处不得不提前介绍一下在Akka中消息的设计模式.随着对Akka的使用,我们会发现,使用Akka设计系统其实就是面向消息编程.actor之间消息 ...
- Codeforces 792C
题意:给出一个由0到9数字构成的字符串,要求删去最少的数位,使得这个字符串代表的数能被3整除,同时要求不能有前导零,并且至少有一位(比如数字11,删去两个1后就没有数位了,所以不符合).如果能够处理出 ...
- C++ friend关键字
友元:友元函数 友元类. 友元函数:不属于任何类,只是在类中声明一下(可以放在 private 或者 public,没有区别),告诉这个类,这个函数是你的朋友,当然朋友不是白当的:这个函数可以访问你的 ...