题目链接:

https://www.lydsy.com/JudgeOnline/problem.php?id=3224

https://www.luogu.org/problemnew/show/P3369

Description

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)

Input

第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)

Output

对于操作3,4,5,6每行输出一个数,表示对应答案

Sample Input

10

1 106465

4 1

1 317721

1 460929

1 644985

1 84185

1 89851

6 81968

1 492737

5 493598

Sample Output

106465

84185

492737

HINT

1.n的数据范围:n<=100000

2.每个数的数据范围:[-2e9,2e9]

可能最近搞平衡二叉搜索树上瘾了?搞完替罪羊树再来搞搞无旋Treap。

关于无旋Treap:

我们已经知道了Treap是怎么写的:BZOJ 3224 - 普通平衡树 - [Treap][Splay]

我们知道,普通的Treap是要zigzag的,而无旋Treap顾名思义就是不需要zigzag。

无旋Treap最基本的(也是核心的)操作只有两种,一种 $Merge$,一种 $Split$。

  $Split(x,k,a,b)$ 拆分操作:按照一个判定值 $k$ 将一个Treap $x$ 拆成两个Treap $a,b$(左树和右树),满足左树的所有值均小于等于 $k$,右树的所有值都大于 $k$。

  $Merge(x,a,b)$ 合并操作:将两个Treap $a,b$ (满足 $a$ 中所有元素均小于 $b$ 中所有元素),合并成一个Treap $x$。合并的原则是节点的堆权值满足堆性质,所以是一种平衡树。

另外,与普通Treap不同的是,每个节点均只存一个元素;也就是说,若存在若干个相同元素,会有若干个节点,而非一个节点用 $cnt$ 去记录。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int INF=INT_MAX;
const int maxn=1e5+; /******************************** FHQ Treap - st ********************************/
int root,nodecnt;
int ch[maxn][];
int key[maxn],dat[maxn];
int siz[maxn];
int NewNode(int val)
{
int x=++nodecnt;
key[x]=val, dat[x]=rand();
siz[x]=, ch[x][]=ch[x][]=;
return x;
}
void Pushup(int x) {
siz[x]=siz[ch[x][]]+siz[ch[x][]]+;
}
void Init()
{
root=nodecnt=;
key[]=dat[]=;
siz[]=, ch[][]=ch[][]=;
}
void Split(int x,int k,int &a,int &b)
{
if(x==)
{
a=b=;
return;
}
if(key[x]<=k) a=x, Split(ch[x][],k,ch[a][],b);
else b=x, Split(ch[x][],k,a,ch[b][]);
Pushup(x);
}
void Merge(int &x,int a,int b)
{
if(a== || b==)
{
x=a+b;
return;
}
if(dat[a]<dat[b]) x=a, Merge(ch[x][],ch[a][],b);
else x=b, Merge(ch[x][],a,ch[b][]);
Pushup(x);
} int GetRank(int val)
{
int a=,b=;
Split(root,val-,a,b);
int res=siz[a]+;
Merge(root,a,b);
return res;
}
int GetKth(int x,int k)
{
if(x==) return INF;
if(siz[ch[x][]]+==k) return key[x];
if(siz[ch[x][]]>=k) return GetKth(ch[x][],k);
else return GetKth(ch[x][],k-siz[ch[x][]]-);
}
void Insert(int val)
{
int a=,b=;
Split(root,val,a,b);
Merge(a,a,NewNode(val));
Merge(root,a,b);
}
void Remove(int val)
{
int a=,b=,c=;
Split(root,val,a,b);
Split(a,val-,a,c);
Merge(c,ch[c][],ch[c][]);
Merge(a,a,c);
Merge(root,a,b);
}
int GetPre(int val)
{
int a=,b=;
Split(root,val-,a,b);
int res=GetKth(a,siz[a]);
Merge(root,a,b);
return res;
}
int GetNxt(int val)
{
int a=,b=;
Split(root,val,a,b);
int res=GetKth(b,);
Merge(root,a,b);
return res;
}
/******************************** FHQ Treap - ed ********************************/ int main()
{
int n,opt,x;
scanf("%d",&n);
Init();
while(n--)
{
scanf("%d%d",&opt,&x);
if(opt==) Insert(x);
if(opt==) Remove(x);
if(opt==) printf("%d\n",GetRank(x));
if(opt==) printf("%d\n",GetKth(root,x));
if(opt==) printf("%d\n",GetPre(x));
if(opt==) printf("%d\n",GetNxt(x));
}
}

无旋Treap真的太好写了啊!!!QAQ又好写又好懂!!!比替罪羊树好多了QAQ!!!

Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]的更多相关文章

  1. Luogu 3369 / BZOJ 3224 - 普通平衡树 - [替罪羊树]

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...

  2. [BZOJ3223]文艺平衡树 无旋Treap

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...

  3. BZOJ3678 wangxz与OJ (平衡树 无旋treap)

    题面 维护一个序列,支持以下操作: 1.在某个位置插入一段值连续的数. 2.删除在当前序列位置连续的一段数. 3.查询某个位置的数是多少. 题解 显然平衡树,一个点维护一段值连续的数,如果插入或者删除 ...

  4. BZOJ3223: Tyvj 1729 文艺平衡树 无旋Treap

    一开始光知道pushdown却忘了pushup......... #include<cstdio> #include<iostream> #include<cstring ...

  5. 无旋Treap - BZOJ1014火星人 & 可持久化版文艺平衡树

    !前置技能&概念! 二叉搜索树 一棵二叉树,对于任意子树,满足左子树中的任意节点对应元素小于根的对应元素,右子树中的任意节点对应元素大于根对应元素.换言之,就是满足中序遍历为依次访问节点对应元 ...

  6. 洛谷 - P4567 - 文本编辑器 - 无旋Treap

    https://www.luogu.org/problem/P4567 事实证明无旋Treap是不是不可能会比Splay快? #include<bits/stdc++.h> using n ...

  7. BZOJ - 3223 Tyvj 1729 文艺平衡树 (splay/无旋treap)

    题目链接 splay: #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f ...

  8. [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

    转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...

  9. [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

    今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...

随机推荐

  1. javascript arguments介绍

    来源于: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments https://g ...

  2. 【RS】Sparse Probabilistic Matrix Factorization by Laplace Distribution for Collaborative Filtering - 基于拉普拉斯分布的稀疏概率矩阵分解协同过滤

    [论文标题]Sparse Probabilistic Matrix Factorization by Laplace Distribution for Collaborative Filtering  ...

  3. sed学习[参考转载]

    一.选项与参数: -n :使用安静(silent)模式.在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上.但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者 ...

  4. Swift 柯里化

    前言 由于柯里化在业务层的应用较少,所以从 Swift 3.0 开始移除了柯里化的用法,但是 Swift 的很多底层特性是使用柯里化来表达的. 1.柯里化 1.1 柯里化简介 柯里化(Currying ...

  5. php static 变量的例子

    class test { public static function a(){} public function b(){} } $obj = new test; 调用 代码 test::a(); ...

  6. Chrome Debugger 温故而知新:上下文环境

    最早是在IOS开发中看到过这种调试方式.在无意间发现Chrome Debugger也可以.直接上图: 解释:默认的控制台想访问变量.都是只能访问全局的.但当我们用debugger; 断点进入到内部时, ...

  7. 在 Redis 上实现的分布式锁

    由于近排很忙,忙各种事情,还有工作上的项目,已经超过一个月没写博客了,确实有点惭愧啊,没能每天或者至少每周坚持写一篇博客.这一个月里面接触到很多新知识,同时也遇到很多技术上的难点,在这我将对每一个有用 ...

  8. 学习MongoDB(Troubleshoot Replica Sets) 集群排除故障

    Test Connections Between all Members(集群中节点网络测试) 在进行Mongodb集群时,每个节点的网络都需要互动,假设有3个服务器节点. m1.example.ne ...

  9. Halcon 1D测量

    1.产生测量句柄,准备提取与矩形(圆弧)主轴垂直的值边缘. gen_measure_rectangle2或gen_measure_arc 2.测量边缘对   ,测量的直线与矩形或者圆弧垂直 measu ...

  10. CMS 01

    环境搭建 工具 sublime mysql 5.7, 数据库管理 Navicat django 1.10, django shell (可以用来检查错误) 操作系统, windows 7 搭建 dja ...