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

随机推荐

  1. 博弈SG函数

    转自:Sprague-Grundy Function-SG函数--博弈论(3) 公平游戏的Sprague-Grundy定理 公平游戏是一种双人游戏,在游戏中双方都有完整的信息,没有牵涉,任何状态的合法 ...

  2. WebApi 中使用 Session

    1. 在 Global.asax.cs 文件中加入session支持 protected void Application_Start() { AreaRegistration.RegisterAll ...

  3. Sql注入_类型

    1.sql注入 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 2.sql注入类型 按照注入点类型来分类 (1)数字型注入点 在 Web ...

  4. 九度OJ 1339:ACM (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:712 解决:379 题目描述: 今年的ACM世界总决赛快要开始了,需要有一个排名算法来对每支队伍进行现场排名.ACM组委会把这个任务交给了你 ...

  5. EventLoop(netty源码死磕4)

    精进篇:netty源码  死磕4-EventLoop的鬼斧神工 目录 1. EventLoop的鬼斧神工 2. 初识 EventLoop 3. Reactor模式回顾 3.1. Reactor模式的组 ...

  6. How to avoid Over-fitting using Regularization?

    http://www.mit.edu/~9.520/scribe-notes/cl7.pdf https://en.wikipedia.org/wiki/Bayesian_interpretation ...

  7. centos samba 服务器的配置和使用

    1.安装samba服务 #yum install samba samba-client samba-swat 2.修改配置文件 #vi /etc/samba/smb.conf security = u ...

  8. 【python】-- 类的装饰器方法、特殊成员方法

    装饰器方法 类的另外的特性,装饰器方法:静态方法(staticmethod).类方法(classmethod).属性方法(property) 一.静态方法 在方法名前加上@staticmethod装饰 ...

  9. web前端开发-Ajax(2)

    前面的一篇博文简单的简绍了Ajax基于jQuery的用法,接下来要对Ajax做进一步的介绍,Ajax请求大致可以通过三种方式发送:原生Ajax,jQuery,伪Ajax.1.原生Ajax: 由于Aja ...

  10. linux 中 用户管理 (composer 时不能root 遇到)

    linux 是支持多用户的,可以同时多个用户在线操作,这点与 Windows 不同. 在我们项目组 操作linux 服务器时,可进行多用户管理,并赋予不同权限,下面是我学习并用的比较频繁的命令: 1. ...