bzoj3224Treap
Splay版本的会补。。。
在学了2个小时Splay之后深感Treap的优越
特地又花了20分钟打了个Treap
至于这些平衡树的优缺点 可以用平衡方式来直观的感受到
现在平衡树们面对着这样的一个问题:“二叉搜索树退化成O(n)”怎么办
Splay说:下面退不退化我不管 我把要查询的点转到根节点上
替罪羊树说:我看哪块不平衡了 我就把它拍扁重建弄成平衡的
SBT说:我旋转强行让深度为logn
RBT说:我手动给每个点打标签让他们出现各种性质然后旋转
而Treap说:在座的各位都是辣鸡 普通的二叉查找树对于随机数据不是平衡的吗?我随机给每个点分派一个数据 让整棵树对于这个随机数据平衡
Splay&替罪羊树&SBT&RBT:Orz
大概就是这样吧
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int maxn=;
const int inf=1e9;
const int mod=;
inline int read()
{
int x=,f=;
char ch=getchar();
while(!isdigit(ch)){if(ch=='')f=-f;ch=getchar();}
while(isdigit(ch)){x=*x+ch-'';ch=getchar();}
return x*f;
}
struct Treenode
{
int l,r,v,rnd,size,w;
};
inline int ran()
{
static int seed=;
seed+=(seed<<)+;
return seed;
}
struct Treap
{
Treenode tr[maxn];
int root,Size,ans;
inline void update(int k){tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w;}
inline void Leftr(int &k)
{
int t=tr[k].r;
tr[k].r=tr[t].l;
tr[t].l=k;
tr[t].size=tr[k].size;
update(k);
k=t;
}
inline void Rightr(int &k)
{
int t=tr[k].l;
tr[k].l=tr[t].r;
tr[t].r=k;
tr[t].size=tr[k].size;
update(k);
k=t;
}
inline void insert(int &k,int x)
{
if(k==)
{
Size++;
k=Size;
tr[k].size=tr[k].w= ;
tr[k].v=x;
tr[k].rnd=ran();
return;
}
tr[k].size++;
if(tr[k].v==x)tr[k].w++;
else if(x>tr[k].v)
{
insert(tr[k].r,x) ;
if(tr[tr[k].r].rnd<tr[k].rnd)Leftr(k) ;
}
else
{
insert(tr[k].l,x) ;
if(tr[tr[k].l].rnd<tr[k].rnd)Rightr(k) ;
}
}
inline void del(int &k,int x)
{
if(k==) return;
if(tr[k].v==x)
{
if(tr[k].w>) {tr[k].w--,tr[k].size--;return;}
if(tr[k].l*tr[k].r==)k=tr[k].l+tr[k].r;
else if(tr[tr[k].l].rnd<tr[tr[k].r].rnd){Rightr(k);del(k,x);}
else{Leftr(k);del(k,x);}
}
else if(x>tr[k].v){tr[k].size--;del(tr[k].r,x);}
else{tr[k].size--;del(tr[k].l,x);}
}
inline int query_rank(int k,int x)
{
if(k==) return ;
if(tr[k].v==x) return tr[tr[k].l].size+ ;
else if(x>tr[k].v) return tr[tr[k].l].size+tr[k].w+query_rank(tr[k].r,x) ;
else return query_rank(tr[k].l,x) ;
}
inline int query_num(int k,int x)
{
if(k==) return ;
if(x<=tr[tr[k].l].size)return query_num(tr[k].l ,x) ;
else if(x>tr[tr[k].l].size+tr[k].w)return query_num(tr[k].r,x-tr[tr[k].l].size-tr[k].w);
else return tr[k].v;
}
inline void query_pro(int k,int x)
{
if(k==)return;
if(tr[k].v<x)
{
ans=k ;
query_pro(tr[k].r,x);
}
else query_pro(tr[k].l,x);
}
inline void query_sub(int k,int x)
{
if(k==) return;
if(tr[k].v>x)
{
ans=k;
query_sub(tr[k].l,x);
}
else query_sub(tr[k].r,x);
}
}treap; int main()
{
int n;
scanf("%d",&n);
int op,x;
for(int i=;i<=n;i++)
{
scanf("%d%d",&op,&x);
if(op==)treap.insert(treap.root,x);
if(op==)treap.del(treap.root,x);
if(op==)printf("%d\n",treap.query_rank(treap.root,x));
if(op==)printf("%d\n",treap.query_num(treap.root,x));
if(op==){treap.ans=;treap.query_pro(treap.root,x);printf("%d\n",treap.tr[treap.ans].v);}
if(op==){treap.ans=;treap.query_sub(treap.root,x);printf("%d\n",treap.tr[treap.ans].v);}
}
}
bzoj3224Treap的更多相关文章
随机推荐
- iOS 启动页放大淡出效果
//屏幕宽度#define kWIDTH [UIScreen mainScreen].bounds.size.width//屏幕高度 #define kHEIGHT [UIScreen mainScr ...
- SpringMVC基于代码的配置方式(零配置,无web.xml)
基于配置文件的web项目维护起来可能会更方便,可是有时候我们会有一些特殊的需求,比方防止客户胡乱更改配置,这时候我们须要给配置隐藏到代码中. 1.创建一个动态web项目(无需web.xml) 2.右键 ...
- python 之前函数补充(__del__, item系列, __hash__, __eq__) , 以及模块初体验
__str__ : str(obj) , 需求必须实现了 __str__, 要求这个方法的返回值必须是字符串 str 类型 __repr__ (意为原型输出): 是 __str__ 的备胎( ...
- Gaby Ivanushka(快排)
Gaby Ivanushka Once upon a time there lived a tsar that has a daughter — Beautiful Vasilisa. There w ...
- EasyDSS直播服务器如何帮助用户解决OBS不能同时同步输出多路直播流到直播平台、CDN平台的限制
最近有用户突然寻求帮助,大概的意思就是说: 他需要同步将桌面的直播同时RTMP发布到:斗鱼.熊猫TV等等多个平台,但是OBS又只能同时采集并发布推流直播到单一个平台,而且有时候在4G或者网络比较差的情 ...
- EasyDSS流媒体解决方案实现的实时数据统计报表、视频文件上传、点播、分享、集成代码等功能
之前的EasyDSS作为rtmp流媒体服务器自从推出就备受用户好评,随着用户的需求的变更产品自身的发展是必须的: 为了更好的用户体验和和功能的完善,我们在EasyDSS的基础上增添了服务器硬件数据报表 ...
- 鼠标画矩形openCV
#include <cv.h> #include <highgui.h> #include <stdio.h> /*鼠标画矩形*/ void my_mouse_ca ...
- SQL查询 [SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的区别(比较)] ---转载
@@IDENTITY (Transact-SQL) 返回最后插入的标识值的系统函数. 备注 在一条 INSERT.SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的 ...
- 虚拟机 minimal 安装增强包
在虚拟机下安装了一个centos的minimal镜像,发现增强包不能安装,鼠标不能在虚拟机和物理机间自由切换.不能共享粘贴板,非常是不爽,这里摸索出在centos minimal OS下安装增强包的 ...
- Excel 文件下载
INCLUDE OLE2INCL * ALV输出 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING I_CALLBACK_PRO ...