题干: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. TP5之model

    使用model 查询数据,添加数据,修改数据,删除数据 聚合操作 获取器,修改器 自动添加时间戳(创建时间,修改时间) 软删除 1.使用model查询数据 $res = User::get(1); / ...

  2. 51nod1014【暴力】

    直接暴力1e6就好了 #include <bits/stdc++.h> using namespace std; typedef long long LL; int main() { LL ...

  3. bzoj 3704: 昊昊的机油之GRST【贪心+脑洞】

    脑洞题大概 首先处理出每个位置需要操作的次数c,假设第一次达到目标就不能再走,这样的操作次数是c差分后值的正数和,就想成分治每一段然后同减最小值然后从0处断开 然后考虑能一圈一圈走的情况,连续一段多走 ...

  4. C#XmlDocument输出字符串

    XmlDocument xmlDoc = new XmlDocument(); //假定该xmlDoc已经有内容; MemoryStream streamXml = new MemoryStream( ...

  5. NowCoder小定律

    题目:https://www.nowcoder.com/pat/2/problem/259 #include <cstdio> #include <cstring> #incl ...

  6. Jquery | 基础 | 使用 jQuery 表单过滤选择器

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. swiper.js插件的使用

    swiper切换动画效果,需要先加载swiper.animate.min.js和animate.min.css. <!DOCTYPE html><html>    <he ...

  8. 洛谷p2922[USACO08DEC]秘密消息Secret Message

    题目: 题目链接:[USACO08DEC]秘密消息Secret Message 题意: 给定n条01信息和m条01密码,对于每一条密码A,求所有信息中包含它的信息条数和被它包含的信息条数的和. 分析: ...

  9. Angular4项目,默认的package.json创建及配置

        1.使用如下命令,可以创建一个默认的 package.json npm  init     创建后如下图所示: 添加 angular4 的 dependencies: npm install@ ...

  10. 使用statement接口实现增,删,改操作