这是一个treap裸题,还可以用splay,替罪羊树,线段树等等写

treap是树和堆结合,可以方便的在O(log(n))期望时间内进行以下操作,因此treap又叫做名次树

  1. 插入x数

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

  3. 查询x数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名)

  4. 查询排名为x的数

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

  6. 求x的后继(后继定义为大于x,且最小的数)
#include<bits/stdc++.h>
#include<ext/rope>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1 using namespace std;
using namespace __gnu_cxx; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f; struct Node{
Node* ch[];
int r;//排名
int v;//权值
int s;//节点数
int flag;
Node()
{
ch[]=ch[]=NULL;
r=rand();v=;
s=flag=;
}
};
Node *root;
void maintain(Node* &o)//更新当前结点子树的节点数
{
o->s=o->flag;
if(o->ch[]!=NULL)o->s+=o->ch[]->s;//左子树不为空就加上数量
if(o->ch[]!=NULL)o->s+=o->ch[]->s;//右子树不为空就加上数量
}
void Rotate(Node* &o,int d)//d=0左旋,d=1右旋
{
Node* k=o->ch[d^];
o->ch[d^]=k->ch[d];
k->ch[d]=o;
maintain(o);maintain(k);
o=k;
}
void Insert(Node* &o,int d)
{
if(o==NULL)//子树为空直接加上去
{
o=new Node;
o->v=d;
return ;
}
else if(o->v==d)//可能会相等
{
o->flag++;
maintain(o);
return ;
}
int d1=d>o->v ? :;//判断搜索哪一颗子树
Insert(o->ch[d1],d);
if(o->ch[d1]->r > o->r)Rotate(o,d1^);
else maintain(o);
}
void Remove(Node* &o,int d)
{
if(o==NULL)return ;
if(o->v==d)
{
if(o->flag>)o->flag--;//该节点有多个数
else
{
if(o->ch[]==NULL&&o->ch[]==NULL)o=NULL;
else if(o->ch[]!=NULL&&o->ch[]!=NULL)
{
if(o->ch[]->r > o->ch[]->r)Rotate(o,),Remove(o->ch[],d);
else Rotate(o,),Remove(o->ch[],d);
}
else //有一个节点不为空,就拿另一个补上
{
if(o->ch[]==NULL)o=o->ch[];
else o=o->ch[];
}
}
if(o!=NULL)maintain(o);
}
else //根据d的大小找左右子树
{
if(d < o->v)Remove(o->ch[],d);
else if(d > o->v)Remove(o->ch[],d);
if(o!=NULL)maintain(o);
}
}
int kth(Node* o,int k)//查询排名为k的节点
{
if(k<||k > o->s||o==NULL)return ;//不合法的情况
int ss=;//左子树的节点
if(o->ch[]!=NULL)ss=o->ch[]->s;
if(k>=ss+&&k<=o->flag+ss)return o->v;
if(ss>=k)return kth(o->ch[],k);//左边够大了,从左边找
else return kth(o->ch[],k-ss-o->flag);
}
int Rank(Node* o,int k)//查询k的排名
{
if(o==NULL)return ;
int ss=;
if(o->ch[]!=NULL)ss=o->ch[]->s;
if(o->v==k)return ss+;
if(o->v > k)return Rank(o->ch[],k);//向左搜
else return ss+o->flag+Rank(o->ch[],k);//加上左子树的节点
}
void qq(Node* o,int k,int &ans)
{
if(o==NULL)return ;
if(o->v < k)
{
ans=max(ans,o->v);
if(o->ch[]!=NULL)qq(o->ch[],k,ans);
}
else
{
if(o->ch[]!=NULL)qq(o->ch[],k,ans);
}
}
void hj(Node* o,int k,int &ans)
{
if(o==NULL)return ;
if(o->v > k)
{
ans=min(ans,o->v);
if(o->ch[]!=NULL)hj(o->ch[],k,ans);
}
else
{
if(o->ch[]!=NULL)hj(o->ch[],k,ans);
}
}
int main()
{
srand(time(NULL));
int n;
cin>>n;
while(n--)
{
int a,b;
cin>>a>>b;
if(a==)Insert(root,b);
else if(a==)Remove(root,b);
else if(a==)printf("%d\n",Rank(root,b));
else if(a==)printf("%d\n",kth(root,b));
else if(a==)
{
int ans=;qq(root,b,ans);
printf("%d\n",ans);
}
else
{
int ans=1e9;hj(root,b,ans);
printf("%d\n",ans);
}
}
return ;
}
/******************* ********************/

洛谷p3369 treap的更多相关文章

  1. 洛谷P3369 【模板】普通平衡树(Treap/SBT)

    洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...

  2. 【洛谷P3369】【模板】普通平衡树题解

    [洛谷P3369][模板]普通平衡树题解 题目链接 题意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3 ...

  3. 洛谷P3369普通平衡树(Treap)

    题目传送门 转载自https://www.cnblogs.com/fengzhiyuan/articles/7994428.html,转载请注明出处 Treap 简介 Treap 是一种二叉查找树.它 ...

  4. 在洛谷3369 Treap模板题 中发现的Splay详解

    本题的Splay写法(无指针Splay超详细) 前言 首先来讲...终于调出来了55555...调了整整3天..... 看到大部分大佬都是用指针来实现的Splay.小的只是按照Splay的核心思想和原 ...

  5. 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会

    平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...

  6. 洛谷 P3369 【模板】普通平衡树 (Treap)

    题目链接:P3369 [模板]普通平衡树 题意 构造一种数据结构满足给出的 6 种操作. 思路 平衡树 平衡树的模板题. 先学习了一下 Treap. Treap 在插入结点时给该结点随机生成一个额外的 ...

  7. AC日记——【模板】普通平衡树(Treap/SBT) 洛谷 P3369

    [模板]普通平衡树(Treap/SBT) 思路: 劳资敲了一个多星期: 劳资终于a了: 劳资一直不a是因为一个小错误: 劳资最后看的模板: 劳资现在很愤怒: 劳资不想谈思路!!! 来,上代码: #in ...

  8. 洛谷P3369 【模板】普通平衡树(FHQ Treap)

    题面 传送门 题解 写了一下\(FHQ\ Treap\) //minamoto #include<bits/stdc++.h> #define R register #define inl ...

  9. [洛谷P3369] 普通平衡树 Treap & Splay

    这个就是存一下板子...... 题目传送门 Treap的实现应该是比较正经的. 插入删除前驱后继排名什么的都是平衡树的基本操作. #include<cstdio> #include< ...

随机推荐

  1. mybaits返回插入成功后的自增值

    mybaits返回插入成功后的自增值 在项目中,我们经常遇到这样的情况:insert语句成功后,需要自增的id值,这个时候,我们可以通过mybatis的 useGeneratedKeys 来实现,具体 ...

  2. c# 当前不会命中断点 未载入该文档

    C#编码时.有时会遇到标题所说的问题,就是说这个文件和方法明明存在,可总是提示找不到方法.解决方法例如以下: 1.清理全部项目(或相关项目)生成 2.又一次加入全部项目(或相关项目)间的互相引用 3. ...

  3. Android 与H5之间的js交互

    之前项目做过一些Android和Html5之间js交互方面的东西,今天有时间就总结一下: 一.为什么要进行js交互: 为了方便原生开发和Html之间数据传递,在静态页面的情况下可以改变原生开发的页面: ...

  4. lua元表(简单例子)

    Set = {} Set.mt = {}--定义普通的表作为元表,为了避免命名污染直接放在Set内部 function Set.new(t) local set = {} setmetatable(s ...

  5. android菜鸟学习笔记18----Android数据存储(二)SharedPreferences

    数据存储的方式,有比直接文件读写更加简便的方式,那就是操作SharedPreferences. SharedPreferences一般用于存储用户的偏好设定,暂时不支持多进程操作. SharedPre ...

  6. nginx访问日志中的时间格式修改

    1.说明 默认的时间格式是:[08/Mar/2013:09:30:58 +0800],由$time_local变量表示. 我想要改成如下格式:2013-03-08 12:21:03. 2.需要修改的文 ...

  7. Mac标识物理位置算法 import Levenshtein mac列表特征值

    mac 字符串 与 基准字符串的 Levenshtein   距离,考虑  mac信号强度的时序性,60秒内若干次变化 不引入强度 mac字符串的唯一性 如何排序 基准字符串的选取 同一尺度 都按强度 ...

  8. 怎样将lua移植到arm平台的linux内核

    将脚本移植到内核是一件非常酷的事情,lua已经被移植到NetBSD的内核中,也有一个叫lunatik的项目把lua移植到了linux内核.仅仅可惜仅仅支持x86.不支持arm,在网上搜索了下,没有找到 ...

  9. html_dom类读取

    上传类文件以后,有三种方式调用这个类:从url中加载html文档从字符串中加载html文档从文件中加载html文档 复制代码 代码如下: <?php// 新建一个Dom实例$html = new ...

  10. JVM性能优化, Part 2 ―― 编译器

    作为JVM性能优化系列文章的第2篇,本文将着重介绍Java编译器,此外还将对JIT编译器常用的一些优化措施进行讨论(参见“JVM性能优化,Part 1″中对JVM的介绍).Eva Andreasson ...