题干:6种操作:

1. 插入x数

2. 删除x数(若有多个相同的数,因只删除一个)

3. 查询x数的排名(若有多个相同的数,因输出最小的排名)

4. 查询排名为x的数

5. 求x的前驱(前驱定义为小于x,且最大的数)

6. 求x的后继(后继定义为大于x,且最小的数)

一道treap板子题(splay也行)

下面是又长又持久的treap:

1.update

维护当前子树大小。

void update(int x)
{
tr[x].size=tr[tr[x].ls].size+tr[tr[x].rs].size+tr[x].w;
}

2.旋转(lturn,rturn)

lturn(x):把x转到原来的左儿子处。

rturn(x):把x转到原来的有儿子处。

void lturn(int &x)
{
int t = tr[x].rs;
tr[x].rs=tr[t].ls;
tr[t].ls=x;
tr[t].size=tr[x].size;
update(x);
x=t;
}
void rturn(int &x)
{
int t=tr[x].ls;
tr[x].ls=tr[t].rs;
tr[t].rs=x;
tr[t].size=tr[x].size;
update(x);
x=t;
}

3.插入

插入一个点。具体步骤:

1.在最下面找到他。

2.加一个随机权值,扔进去。(随机权值目的:防止树退化成一条链,若退化则会将后面操作的时间复杂度从O(logn)变成O(n)。)

void insert(int &k , int x)
{
if(k == )
{
cnt ++ ;
k = cnt ;
tr[k].size = tr[k].w = ;
tr[k].n1 = x ;
tr[k].n2 = rand() ;
return ;
}
tr[k].size ++ ;
if(tr[k].n1 == x) tr[k].w ++ ;
else if(x > tr[k].n1)
{
insert(tr[k].rs , x) ;
if(tr[tr[k].rs].n2 < tr[k].n2) lturn(k) ;
}else
{
insert(tr[k].ls , x) ;
if(tr[tr[k].ls].n2 < tr[k].n2) rturn(k) ;
}
}

如果不会随机数的话。。。https://www.cnblogs.com/LiGuanlin1124/p/9592229.html

4.删除

比插入复杂一点:

1.找到他。

2.分情况讨论:

{

  (1).只有一个儿子,则直接将其附成儿子。

  (2).儿女双全。选两个儿子中随机数rand值小的转上去,一直转到其满足(1)。(即将他儿子转没。)

    (3),没有儿子。残忍地return。

}

代码:

void del(int &k,int x)
{
if(!k)return ;
if(tr[k].n1==x)
{
if(tr[k].w>)
{
tr[k].size--;
tr[k].w--;
return ;
}
if(tr[k].ls*tr[k].rs==)
{
k=tr[k].ls+tr[k].rs;
}else if(tr[tr[k].ls].n2<tr[tr[k].rs].n2)
{
rturn(k);
del(k,x);
}else
{
lturn(k);
del(k,x);
}
}else if(tr[k].n1<x)
{
tr[k].size--;
del(tr[k].rs,x);
}else
{
tr[k].size--;
del(tr[k].ls,x);
}
}

5.查询排名,查询某排名是谁

难度小了很多,递归就行。

int pm(int k,int x)
{
if(!k)return ;
if(tr[k].n1==x)
{
return tr[tr[k].ls].size+;
}
if(tr[k].n1<x)
{
return tr[tr[k].ls].size+tr[k].w+pm(tr[k].rs,x);
}else
{
return pm(tr[k].ls,x);
}
}
int qp(int k,int x)//k子树内排名x的数
{
if(!k)return ;
if(x>tr[tr[k].ls].size&&x<=tr[tr[k].ls].size+tr[k].w)
{
return tr[k].n1;
}else if(x<=tr[tr[k].ls].size)
{
return qp(tr[k].ls,x);
}else
{
return qp(tr[k].rs,x-tr[tr[k].ls].size-tr[k].w);
}
}

6.前驱后继

这是平衡树最普遍的用途了吧。

int ans;
void qq(int k,int x)
{
if(!k)return ;
if(tr[k].n1<x)
{
ans=k;
qq(tr[k].rs,x);
}else
{
qq(tr[k].ls,x);
}
}
void hj(int k,int x)
{
if(!k)return ;
if(tr[k].n1>x)
{
ans=k;
hj(tr[k].ls,x);
}else
{
hj(tr[k].rs,x);
}
}

普通平衡树(treap)的更多相关文章

  1. hiho #1325 : 平衡树·Treap

    #1325 : 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? ...

  2. hiho一下103周 平衡树·Treap

    平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...

  3. 算法模板——平衡树Treap 2

    实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728) 这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣 ...

  4. 【山东省选2008】郁闷的小J 平衡树Treap

    小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的.具体说来,书架由N ...

  5. Hihocoder 1325 平衡树·Treap(平衡树,Treap)

    Hihocoder 1325 平衡树·Treap(平衡树,Treap) Description 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉 ...

  6. HihoCoder 1325 平衡树·Treap

    HihoCoder 1325 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说 ...

  7. 普通平衡树Treap(含旋转)学习笔记

    浅谈普通平衡树Treap 平衡树,Treap=Tree+heap这是一个很形象的东西 我们要维护一棵树,它满足堆的性质和二叉查找树的性质(BST),这样的二叉树我们叫做平衡树 并且平衡树它的结构是接近 ...

  8. HihoCoder1325 : 平衡树·Treap(附STL版本)

    平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二 ...

  9. luoguP3369[模板]普通平衡树(Treap/SBT) 题解

    链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...

  10. 2021.12.06 平衡树——Treap

    2021.12.06 平衡树--Treap https://www.luogu.com.cn/blog/HOJQVFNA/qian-xi-treap-ping-heng-shu 1.二叉搜索树 1.1 ...

随机推荐

  1. 875. Koko Eating Bananas

    Koko loves to eat bananas.  There are N piles of bananas, the i-th pile has piles[i] bananas.  The g ...

  2. Codeforces626B - Cards【模拟】

    题意: 两张相同可以合并成相同: 两张不同可以产生另外一个不同: 求最终的可能颜色: 思路: 模拟啊. 总共也就那么几种情况,具体看挫code--. #include<iostream> ...

  3. 框架基础:关于ajax设计方案(三)---集成ajax上传技术

    之前发布了ajax的通用解决方案,核心的ajax发布请求,以及集成了轮询.这次去外国网站逛逛,然后发现了ajax level2的上传文件,所以就有了把ajax的上传文件集成进去的想法,ajax方案的l ...

  4. jdbc 连接 sqlserver 学习

    使用sqljdbc.jar 连接sqlserver 下载网址: http://www.drv5.cn/sfinfo/8228.html#softdown package test_sql_server ...

  5. 序列/树上差分小结 By cellur925

    首先我们需要注意一下的是,差分比较适用于修改比较多而查询比较少的情况. 一.序列上差分 借教室  这是一道二分答案,在check函数中用到差分技巧的一道题,譬如说我们要把一个序列中[l,r]区间都加上 ...

  6. java webRoot 路径问题

    项目部署后的目录结构 src 生成到 WEB-INF\classes文件下; WebRoot  为项目的根目录,应用中“/action”就相当于是系统目录中的”WebRoot/action" ...

  7. zabbix被动模式和主动模式

    1 被动模式 zabbix默认采用被动模式.就是agent等待server采集数据. 在items中,type为zabbix agent就是指被动模式. 流程为:agent周期性收集数据,server ...

  8. redis的多路复用io

    redis基于reactor开发了自己的网路事件处理器,被称为文件事件处理器.使用io多路复用来同时监听多个套接字,来响应客户端的连接应答.命令请求.命令恢复.多路复用技术使得redis可以使用单进程 ...

  9. 题解报告:poj 2480 Longge's problem(欧拉函数)

    Description Longge is good at mathematics and he likes to think about hard mathematical problems whi ...

  10. css新奇技术及其未来发展

    1.图像替换技术: 图像替换技术是指使用图像替换页面中文本的功能,类似与在页面中插入图像,只是这种方法更为方便,易于代码管理.通常来说,设计者习惯使用有意义的图像去替换一些标题,logo和某些特定的页 ...