题干: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. Codeforces - 1081C - Colorful Bricks - 简单dp - 组合数学

    https://codeforces.com/problemset/problem/1081/C 这道题是不会的,我只会考虑 $k=0$ 和 $k=1$ 的情况. $k=0$ 就是全部同色, $k=1 ...

  2. PhpStorm之设置字体大小

    1.点击左上角的File,再点击setting:(Ctrl+Alt+S) 2.进入 Editor  /  General,选择 Change font size (Zoom) with Ctrl+Mo ...

  3. android 在一个应用中启动另一个应用

    在程序开发过程当中,常遇到需要启动另一个应用程序的情况,比如在点击软件的一个按钮可以打开地图软件. 如果既有包名又有主类的名字,那就好 办了, 直接像下面就行: [html]  Intent inte ...

  4. 关于国债的一些计算: 理论TF价格2(缴款日前有付息)

    计算 ExpectedTFPrice 是一个比较复杂的计算,我们这里讨论复杂的一种情况. 给定一只可交割国债bond(一般为CTD),一个国债期货tf, 在t日(表示tf的一个交易日期,我们通过bon ...

  5. bzoj 2331: [SCOI2011]地板【插头dp】

    一开始设计了四种状态,多了一种已经拐弯但是长度为0的情况,后来发现不用,设012表示没插头,没拐弯的插头,拐了弯的插头,然后转移的话12,21,22都不合法,剩下的转移脑补一下即可,ans只能在11, ...

  6. 黑客攻防技术宝典Web实战篇:避开客户端控件习题

    猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. 通过客户端传送的数据如何阻止破坏性攻击? 可以使用保存在服务器上的密钥对数据进行加密或散列 ...

  7. postman接口测试系列:环境配置

      最近忙着项目接口测试,经过不同工具的对比,发现postman使用起来挺顺手的,所以马上决定使用这个工具进行接口测试工作.刚开始的时候,了解了下接口测试的相关信息,直接着手编写接口测试的测试用例信息 ...

  8. Redis的高级特性哨兵

    一.哨兵介绍 Redis Sentinel,即Redis哨兵,在Redis 2.8版本开始引入.哨兵的核心功能是主节点的自动故障转移.下面是Redis官方文档对于哨兵功能的描述: 监控(Monitor ...

  9. 「开源」目前见过的最好的开源OA产品

    这是我目前见过的最好的开源OA产品.功能完整,代码结构清晰.值得推荐. 1.项目介绍 oasys是一个OA办公自动化系统,使用Maven进行项目管理,基于springboot框架开发的项目,mysql ...

  10. the little schemer 笔记(4)

    第四章 numbers games 14 是原子吗 是的,数都是原子 (atom? n) 是真还是假,其中n是14 真,14 是原子 -3是数吗 是的,不过我们暂不考虑负数 3.14159是数吗 是的 ...