模板——无旋Treap
#include "bits/stdc++.h"
using namespace std;
inline int read(){
int s=,k=;char ch=getchar();
while(ch<''|ch>'') ch=='-'?k=-:,ch=getchar();
while(ch>&ch<='') s=s*+(ch^),ch=getchar();
return s*k;
}
const int N=1e5+,inf=0x7fffffff;
#define size(t) (t?t->size:0)
struct Treap{
Treap *son[];
int fix,val,size;
Treap (int v){
size=,val=v,fix=rand();
son[]=son[]=NULL;
}
inline void update(){
size=+size(son[])+size(son[]);
}
}*root;
typedef pair<Treap*,Treap*> D;
inline Treap *merge(Treap *a,Treap *b){
if(!a||!b) return a?a:b;
if(a->fix<b->fix){
a->son[]=merge(a->son[],b);a->update();return a;
}else {
b->son[]=merge(a,b->son[]);b->update();return b;
}
}
inline D split(Treap *p,int k){
if(!p) return D(NULL,NULL);
D y;
if(size(p->son[])>=k)
y=split(p->son[],k),p->son[]=y.second,p->update(),y.second=p;
else
y=split(p->son[],k--size(p->son[])),p->son[]=y.first,p->update(),y.first=p;
return y;
}
inline int get_rnk(int val){
int ret=;
for(Treap *t=root;t;t=t->son[val>t->val])
if(t->val<val) ret+=+size(t->son[]);
return ret;
}
inline int findkth(int k){
D x=split(root,k-);
D y=split(x.second,);
Treap *ans=y.first;
root=merge(merge(x.first,ans),y.second);
return ans?ans->val:;
}
inline void insert(int val){
int k=get_rnk(val);
D x=split(root,k);
Treap *p=new Treap(val);
root=merge(merge(x.first,p),x.second);
}
inline void erase(int val){
int k=get_rnk(val);
D x=split(root,k);
D y=split(x.second,);
root=merge(x.first,y.second);
}
int main(){
freopen("phs.in","r",stdin);
freopen("phs.out","w",stdout);
srand();
int m,opt,x;m=read();
while(m--){
opt=read(),x=read();
switch(opt)
{
case :insert(x);break;
case :erase(x);break;
case :printf("%d\n",get_rnk(x)+);break;
case :printf("%d\n",findkth(x));break;
case :printf("%d\n",findkth(get_rnk(x)));break;
case :printf("%d\n",findkth(get_rnk(x+)+));break;
}
}
}
模板——无旋Treap的更多相关文章
- 模板 - 无旋Treap
一般而言作为一棵平衡树只需要插入,删除,值求排名,排名求值,前驱,后继,六个接口. #include<bits/stdc++.h> using namespace std; typedef ...
- [模板] 无旋Treap (C++ class)
注意!本帖不是算法介绍!只是贴代码(逃) //嫌stdlib的rand太慢,手打了一个 /* Author: hotwords */ typedef unsigned int tkey; class ...
- 无旋treap的简单思想以及模板
因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...
- 模板 - 数据结构 - 可持久化无旋Treap/PersistentFHQTreap
有可能当树中有键值相同的节点时,貌似是要对Split和Merge均进行复制的,本人实测:只在Split的时候复制得到了一个WA,但只在Merge的时候复制还是AC,可能是恰好又躲过去了.有人说假如确保 ...
- 洛谷 - P3391 【模板】文艺平衡树(Splay) - 无旋Treap
https://www.luogu.org/problem/P3391 使用无旋Treap维护序列,注意的是按顺序插入的序列,所以Insert实际上简化成直接root和Merge合并,但是假如要在序列 ...
- 浅谈无旋treap(fhq_treap)
一.简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树. 无旋Treap是一个叫 ...
- [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )
转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec Mem ...
- [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...
- [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...
随机推荐
- redis存入中文,取出来显示不正常
问题: 127.0.0.1:6379> set name 张泰松OK127.0.0.1:6379> get name"\xe5\xbc\xa0\xe6\xb3\xb0\xe6\x ...
- WebLogic域配置策略
WebLogic域配置策略--手动和模板选项,第一部分 域含有BEA WebLogic Server实例的配置信息.它包含有关服务器.集群和机器的配置信息.域还含有关于资源,例如Java数据库连接(J ...
- IDEA: 遇到问题Error during artifact deployment. See server log for details解决方法
1.检查tomcat是否配置正确. 2.检查配置文件是否配置正确,web.xml.等. 3. 4.
- 解决ubuntu unity下gvim菜单消失的问题
#问题描述:在终端下用gvim 指令打开 gvim就不显示菜单.在不启用unity的桌面环境下用终端打开gvim是有菜单的.从程序菜单中打开gvim是显示菜单的.用sudo打开gvim也可以显示菜单, ...
- self-sizing cell的一个问题
如何TableViewCell里面再加上CollectionView这类的ScrollView玩意,那自动算高就失效了,还是得用 override func tableView(_ tableView ...
- 启动SpringBoot的可执行jar 报错:target\spring-boot-hello-1.0-SNAPSHOT.jar中没有主清单属性
打包成功,但是在执行时报错,没有主清单属性 解决: 增加红框内的依赖: <build> <plugins> <plugin> <groupId>org. ...
- 为什么在JDBC要使用Class.forName();这句话
为什么在调用JDBC的时候,我们总要写这句话:Class.forName("驱动类");解释:在JDBC编程中一般有以下几个步骤:1>加载驱动,也就是Class.forNam ...
- 【热身】github的使用
GitHub 可以托管各种Git版本库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性.为一个 ...
- 读《图解HTTP》有感-(HTTP报文内的HTTP消息)
写在前面 HTTP通信包括从客户端到服务端的的请求以及服务端返回客户端的响应 正文 1.什么是HTTP报文?它由什么构成?包含几个部分? 用于HTTP协议交互的信息就是HTTP报文:它是由多行数据构成 ...
- Spark Streaming入门
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文将帮助您使用基于HBase的Apache Spark Streaming.Spark Streaming是Spark API核心的一个扩 ...