洛谷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的更多相关文章

  1. 【模板】可持久化文艺平衡树-可持久化treap

    题目链接 题意 对于各个以往的历史版本实现以下操作: 在第 p 个数后插入数 x . 删除第 p 个数. 翻转区间 [l,r],例如原序列是 \(\{5,4,3,2,1\}\),翻转区间 [2,4] ...

  2. 可持久化Treap

    终于写了一次可持久化Treap,做的是可持久化序列的模板题. Treap Treap=Tree+Heap,是一个随机化的数据结构.它的每个节点至少有两个关键字,一个是我们要存储的\(val\),一个是 ...

  3. UVALive 6145 Version Controlled IDE(可持久化treap、rope)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  4. BZOJ 3595: [Scoi2014]方伯伯的Oj SBT+可持久化Treap

    3595: [Scoi2014]方伯伯的Oj Time Limit: 6 Sec  Memory Limit: 256 MBSubmit: 102  Solved: 54[Submit][Status ...

  5. 高rong效chang的可持久化treap

    很多人觉得可持久化treap很慢,但是事实上只是他们可持久化treap的写法不对.他们一般是用split和merge实现所有功能,但是这样会有许多不必要的分裂.其实我们可以用一种特殊的方式来实现插入和 ...

  6. Codeforces - 38G 可持久化Treap 区间操作

    题意:\(n\)个人排队,每个人有重要度\(p\)和不要脸度\(c\),如果第\(i\)个人的重要度大于第\(i-1\)个人的重要度,那么他们之间可以交换,不要脸度-1,交换后先前的第\(i\)个人也 ...

  7. Codeforces - 675D 可持久化Treap 树形操作

    题意:模拟二叉树的构造过程,给出\(n\)个节点,每次从根插入,小于当前节点转到左儿子,否则右儿子,输出第\([2,n]\)个节点的父亲的权值 直接手动模拟会被链式结构T掉 网上找了下发现二叉树的性质 ...

  8. 平衡树与可持久化treap

    平衡树(二叉树) 线段树不支持插入or删除一个数于是平衡树产生了 常见平衡树:treap(比sbt慢,好写吧),SBT(快,比较好写,有些功能不支持),splay(特别慢,复杂度当做根号n来用,功能强 ...

  9. 脑洞大开加偏执人格——可持久化treap版的Link Cut Tree2

    试了一下先上再下的Treap方式,很高兴,代码变短了,但是,跑的变慢了!!!其实慢得不多,5%左右.而且这个版本的写法不容易写错..只要会一般可持久化Treap的人写着都不难...就是相对于(压行的) ...

  10. 脑洞大开加偏执人格——可持久化treap版的Link Cut Tree

    一直没有点动态树这个科技树,因为听说只能用Splay,用Treap的话多一个log.有一天脑洞大开,想到也许Treap也能从底向上Split.仔细思考了一下,发现翻转标记不好写,再仔细思考了一下,发现 ...

随机推荐

  1. 理解SetCapture、ReleaseCapture、GetCapture(控制了消息发往哪个窗口,即消息窗口)

    理解SetCapture.ReleaseCapture.GetCapture 正常情况下,鼠标指针位于哪个窗口区域内,鼠标消息就自动发给哪个窗口.如果调用了SetCapture,之后无论鼠标的位置在哪 ...

  2. bzoj1833

    http://www.lydsy.com/JudgeOnline/problem.php?id=1833 2.5个小时就花在这上面了... 水到200题了...然并卵,天天做水题有什么前途... #i ...

  3. mysql大数据的分表

    在实际业务运作中,我们经常遇到一个表中数据量过大的问题,这样的话,问题就来了.如何将一个表中的数据均衡的放到多个表中? 我的建议是,新建一个表,但是只有一个自增的id字段,将其作为分表的依据.有大数据 ...

  4. Akka源码分析-Actor发消息

    前面两篇文章简单介绍了ActorSystem.actor以及dispatcher和mailbox的创建,下面我们就来看一下actor发消息的内部机制. val system = ActorSystem ...

  5. 哈夫曼编码译码系统(c/c++)

    哈夫曼编码译码系统的实现,主要包含三部分: 1.创建哈夫曼树 2.编码函数 3.译码函数 编写代码时为了方便,在这里混用了c++的输入输出流.主体用c语言实现. 下面时代码部分: 1.头文件,以及储存 ...

  6. Java使用Player播放mp3

    大家平时闲了都会听听歌,散散心,于是很多人就问,在Java里边如何播放歌曲呢,唉,别说,在Java里边还真能歌曲,下面我为大家揭晓. 我们都知道Java里边做什么都需要对应的jar包,首先贴上mave ...

  7. iis 服务器而配置php运行环境

    第一步 下载php 下载压缩包就可以了 第二步 解压缩php到某个目录,比如D:\php php目录里面有两个php.ini,一个是php.ini-dist,比较适合开发用:一个是php.ini-re ...

  8. UNIX环境高级编程--4

    函数stat fstat fstatat 和 lstat stat函数使用最多的地方可能就是ls -l 命令,用其可以获得有关一个文件的所有信息. 文件类型: (1)普通文件 (2)目录文件 (3)块 ...

  9. 启用禁用USB接口

    一个小工具,功能有启用禁用外网.USB接口,可由服务端socket长链接进行操控客户端从而达到实现前边的这些功能,这里贴上核心代码,先给上启用禁用USB接口吧,这个方法可随时启用禁用,之前用过一个改u ...

  10. 跨域请求之jsonp

    1.什么是跨域请求: 服务器A上的一个页面,要请求服务器B上的一个处理程序,这就叫做跨域请求 本次的测试页面为: 处理程序kimhandler.ashx,如下: http://qxw119243026 ...