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的更多相关文章
随机推荐
- centos7.0 增加/usr分区的容量减少home分区的大小
把/home内容备份,然后将/home文件系统所在的逻辑卷删除,扩大/root文件系统,新建/home:tar cvf /tmp/home.tar /home #备份/homeumount /home ...
- EhCache 集群 配置(RMI方式)
这里先说明下环境:JDK1.6.ehcache-core-2.1.0.jar.Tomcat6.Spring3.0.2.使用的是RMI方式配置集群的,这里先吐槽下遇到的情况,在搜相关知识的时候发现到处都 ...
- 合唱队形(LIS)
合唱队形 OpenJ_Bailian - 2711 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. 合唱队形是指这样的一种队形:设K位同 ...
- [原创]实现多层DIV叠加的js事件穿透
Flash里面有个很好的特性是,一个容器里,不存在实际对象的部分,不会阻拦鼠标事件穿透到下一层. 前端就不一样了,两个div层叠以后,上层div会接收到所有事件(即使这个div里面内容是空的,没有任何 ...
- 2017-2018-1 20179209《Linux内核原理与分析》第八周作业
Linux内核如何装载和启动一个可执行程 一.实验 1.1理解编译链接的过程和ELF可执行文件格式. 1.1.1编译链接过程 能用图说明的问题,就少用文字描述: 1.1.2ELF可执行文件 ELF可执 ...
- 换教室(期望+DP)
换教室(期望+DP) \(dp(i,j,1/0)\)表示第\(i\)节课,申请了\(j\)次调换,这节课\(1/0\)调换. 换教室 转移的时候考虑: 上次没申请 这次也没申请 加上\(dis(fr[ ...
- 使用oracle10g官方文档找到监听文件(listener.ora)的模板
***********************************************声明*************************************************** ...
- CryptoJS加密
<script type="text/javascript" src="CryptoJS/core.min.js"></script>& ...
- QT5的exe的发布
直接release的exe文件需要很多dll关联,一个一个找又太麻烦. 其实QT5带有一个 windeployqt 工具 Qt Widgets Application可执行程序发布方式 首先用 QtC ...
- Yii2 关于电子商务的开源项目
https://github.com/samdark/yii2-shop https://github.com/omnilight/yii2-shopping-cart https://github. ...