#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int INF=0x3fffffff;
int node_cnt; //结点计数器
struct Node;
typedef Node * pNode; //结点指针
struct Node //结点定义
{
int key, val, size, same;
pNode ls, rs;
Node(int val):val(val), size(1), same(1){ ls=rs=NULL; key=rand(); }
int lsize(){ return ls?ls->size:0; } //避免空指针查询
int rsize(){ return rs?rs->size:0; } //避免空指针查询
void update(){ size=lsize()+rsize()+same; }
};
void zig(pNode &p) //左旋
{
pNode tmp=p->rs; p->rs=tmp->ls; tmp->ls=p; tmp->size=p->size; p->update(); p=tmp;
}
void zag(pNode &p) //右旋
{
pNode tmp=p->ls; p->ls=tmp->rs; tmp->rs=p; tmp->size=p->size; p->update(); p=tmp;
}
void treap_insert(int x, pNode &p) //插入结点
{
if(!p){ p=new Node(x); node_cnt++; return; };
if(p->val==x) { p->same++; p->update(); node_cnt++; return; }
if(x< p->val) { treap_insert(x, p->ls); if(p->key>p->ls->key) zag(p); }
if(x> p->val) { treap_insert(x, p->rs); if(p->key>p->rs->key) zig(p); }
p->update();
}
void treap_delete(int x, pNode &p) //删除结点
{
if(!p) return; //没找到
if(x<p->val) treap_delete(x, p->ls);
if(x>p->val) treap_delete(x, p->rs);
if(x==p->val)
{
if(p->same>1) { p->same--; p->update(); node_cnt--; return; } //多个相同的,删除一个
if(!(p->ls) && !(p->rs)){ delete p; p=NULL; node_cnt--; return; } //没有子树,直接删除
else if(!p->ls && p->rs){ delete p; p=p->rs; node_cnt--; } //只有右子树
else if(p->ls && !p->rs){ delete p; p=p->ls; node_cnt--; } //只有左子树
else //有左、右子树
{
if(p->ls->key<p->rs->key) zag(p), treap_delete(x, p->rs);
else zig(p), treap_delete(x, p->ls);
}
}
p->update();
}
int treap_rank(int x, const pNode &p) //查询元素排名
{
if(!p) return 0; //没找到
if(p->val==x) return p->lsize()+1;
else if(p->val <x) return p->lsize()+p->same+treap_rank(x, p->rs);
else return treap_rank(x, p->ls); //这个函数是存在问题的,如果要查找的数字不存在,排名就是N或0,该如何解决?
}
int treap_find(int k, const pNode &p) //查询排名为k的元素
{
if(k>node_cnt) return INF; //如果k大于实际节点数,返回无穷大
int tmp=p->lsize()+p->same;
if(p->lsize()<k && k<=tmp) return p->val;
else if(k>tmp) return treap_find(k-tmp, p->rs);
else return treap_find(k, p->ls);
}
int treap_pre(int x, const pNode &p) //查找x的前驱
{
if(!p) return -INF; //找不到返回无穷小
if(x<=p->val) return treap_pre(x, p->ls);
else return max(p->val, treap_pre(x, p->rs));
}
int treap_next(int x, const pNode &p) //查找x的后继
{
if(!p) return INF; //找不到返回无穷大
if(x>=p->val) return treap_next(x, p->rs);
else return min(p->val, treap_next(x, p->ls));
}
int main()
{
int n;
pNode root=NULL;
scanf("%d", &n);
for(int i=1, opt, x; i<=n; i++)
{
scanf("%d%d", &opt, &x);
if(opt==1) treap_insert(x, root);
if(opt==2) treap_delete(x, root);
if(opt==3) printf("%d\n", treap_rank(x, root));
if(opt==4) printf("%d\n", treap_find(x, root));
if(opt==5) printf("%d\n", treap_pre(x, root) );
if(opt==6) printf("%d\n", treap_next(x, root));
}
return 0;
}

平衡树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. Powershell-远程操作

    1. 查看WinRM是否开启 Get-Service WinRM 2. Enable-PSRemoting –Force 3. 进行信任设置: Set-Item wsman:\localhost\cl ...

  2. mysql No query specified

    MySQL SHOW CREATE TABLE tablename \G; 会出现 ERROR: No query specified 原因 去掉分号 ; \g \G三者选其一即可.

  3. Linux(CentOS7)设置开放端口

    查看已经开放的端口:firewall-cmd --list-ports 开启端口: firewall-cmd --zone=public --add-port=端口号/tcp --permanent ...

  4. Django Template(模板)

    一.模板组成 组成:HTML代码 + 逻辑控制代码 二.逻辑控制代码的组成 1.变量 语法格式 : {{ name }} # 使用双大括号来引用变量 1.Template和Context对象(不推荐使 ...

  5. Elastic Stack-Elasticsearch使用介绍(三)

    一.前言     上一篇说了这篇要讲解Search机制,但是在这个之前我们要明白下文件是怎么存储的,我们先来讲文件的存储然后再来探究机制: 二.文档存储 之前说过文档是存储在分片上的,这里要思考一个问 ...

  6. mysql查询order by 指定字段排序

    当MySQL查询时排序的字段不是数字时而是汉字的时候也可以用when  then 来指定排序. 列如yewu_check表的status 字段不是0,1,2而是汉字待办,已办,退回.可以如下写法: S ...

  7. .a 文件 和 so 文件

           所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分.当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源..so文件是共 ...

  8. 菜鸟学IT-分布式版本控制系统Git的安装与使用

    分布式版本控制系统Git的安装与使用 本次作业要求来于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2103 一.首先在window ...

  9. Flutter绘制波浪

    以上动画是仿照 里面的物理动画还未仿写 代码见  https://github.com/dnoyeb/syk_flutter

  10. ubuntu beyond compare到期后续期

    rm -f /home/agu/.config/bcompare/registry.dat 或者加入定时任务,每天10:00执行 crontab -e * 10 * * * rm -f /home/a ...