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. Swift开发教程--怎样设置状态栏的文字颜色

    第一步:在Info.plist中设置UIViewControllerBasedStatusBarAppearance 为NO 第二步:在viewDidLoad中加一句 UIApplication.sh ...

  2. windowsphone8.1学习笔记之Toast通知

    熟悉或者了解wp系统的人都知道wp的Toast,Toast(吐司)通知是在屏幕最顶上弹出来的提示框,它专为与锁屏提醒.磁贴通知和应用中UI结合使用而设计,但它不是MessageDialog.说简单点它 ...

  3. 优化tomcat启动速度

    1.去掉不需要的jar包,这样tomcat在启动时就可以少加载jar包里面的class文件. 2.跳过一些与TLD files.注解.网络碎片无关的jar包,通过在conf/catalina.prop ...

  4. 【python】-- web开发之JavaScript

    JavaScript JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. ...

  5. linux c编程:信号(三) sigprocmask和sigpending函数

    信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程.从信号产生到传递给目标进程的流程图如下图所示: 进程可以阻塞信号的传递.当信号源为目标进程产生了一个信号之后,内核会执行依 ...

  6. 使用javascript的eval函数解析json字符串,提示“not avalible”怎么办?

    按照最简单的形式,可以用下面这样的 JSON 表示"名称 / 值对": var jsonString = '{ "firstName": "Brett ...

  7. pandas to_datetime()

    >>> import pandas as pd >>> i = pd.date_range() >>> df = pd.DataFrame(dic ...

  8. 转 Oracle 11g服务详细介绍

    转自http://www.cnblogs.com/userWuLiang/archive/2013/04/13/3017900.html Oracle 11g服务详细介绍及哪些服务是必须开启的? 成功 ...

  9. China sets economic reform priorities for 2015

    BEIJING -- China's State Council, the cabinet, on Monday unveiled this year's priorities for economi ...

  10. X-Scan扫描端口80,443提示http TRACE 跨站攻击漏洞解决办法

    在用X-Scan-v3.3扫描主机端口提示http TRACE 跨站攻击漏洞; 一,修改配置文件httpd.conf 1.1 apache下面修改httpd.conf文件,在文件最后面新建一行加入:T ...