模板——无旋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一样,都要同时满足树性质和堆性质,我 ...
随机推荐
- aes加解密 Illegal key size
做aes加密时,发生一个奇怪的错误,在本地环境是好的,发布到测试环境就出问题, java.security.InvalidKeyException: Illegal key size 想到本地环境之前 ...
- 自设table表格,获取内容,并经弹出框的url传参,获取结果显示在弹出框,并加载合计
table表格,选择框 form id="editForm1"> <table class="table_form"> <td > ...
- IBM RAD 快捷键
Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ ...
- JeeSite
JeeSite是一个 开源的企业信息管理系统 基础框架.主要定位于"企业信息管理"领域,可用作企业信息管理类系统.网站后台管理类系统等.JeeSite是非常强调开发的高效性.健壮性 ...
- SQL 经典语句
15题需要再分析.没弄懂 使用scott/tiger用户下的emp表和dept表完成下列练习, 表的结构说明如下 emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hir ...
- 全面解读Java NIO工作原理(2)
全面解读Java NIO工作原理(2) 2011-12-14 10:31 Rollen Holt Rollen Holt的博客 我要评论(0) 字号:T | T JDK 1.4 中引入的新输入输出 ( ...
- SqlServer中的事务隔离级别、锁机制
事务 作用:用来执行一连串的动作,并且保证所有动作要么都执行.要么都不执行. 属性:原子行.一致性.隔离性.持久性 锁 作用:SqlServer使用锁来实施事务隔离属性. 阻塞 定义:如果一个事务持有 ...
- Spring,@Controller,@RequestMapping, @ResponseBody,@RequestParam
1.@Controller,放在类的上方,使类生效; 2.@RequestMapping,,指定一个映射,method为访问方式,headers为含有指定请求头 3. @ResponseBody将返回 ...
- var $this = $(this)是什么意思?
var $this = $(this) 声明一个变量,$this 是变量名,加$说明是jquery对象. 给声明的变量赋值,赋的值是将this元素转换为jQuery对象.
- gawk编程语言
gawk是一门功能丰富的编程语言,你可以通过它所提供的各种特性来编写好几程序处理数据. 22.1 使用变量 gawk编程语言支持两种不同类型的变量: 内建变量和自定义变量 22.1.1 内建变量 ga ...