Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接:
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]的更多相关文章
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [替罪羊树]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- [BZOJ3223]文艺平衡树 无旋Treap
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...
- BZOJ3678 wangxz与OJ (平衡树 无旋treap)
题面 维护一个序列,支持以下操作: 1.在某个位置插入一段值连续的数. 2.删除在当前序列位置连续的一段数. 3.查询某个位置的数是多少. 题解 显然平衡树,一个点维护一段值连续的数,如果插入或者删除 ...
- BZOJ3223: Tyvj 1729 文艺平衡树 无旋Treap
一开始光知道pushdown却忘了pushup......... #include<cstdio> #include<iostream> #include<cstring ...
- 无旋Treap - BZOJ1014火星人 & 可持久化版文艺平衡树
!前置技能&概念! 二叉搜索树 一棵二叉树,对于任意子树,满足左子树中的任意节点对应元素小于根的对应元素,右子树中的任意节点对应元素大于根对应元素.换言之,就是满足中序遍历为依次访问节点对应元 ...
- 洛谷 - P4567 - 文本编辑器 - 无旋Treap
https://www.luogu.org/problem/P4567 事实证明无旋Treap是不是不可能会比Splay快? #include<bits/stdc++.h> using n ...
- BZOJ - 3223 Tyvj 1729 文艺平衡树 (splay/无旋treap)
题目链接 splay: #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f ...
- [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...
- [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...
随机推荐
- opencv-android笔记1:android studio 2.3 + opencv-android-sdk 实现 camera预览
Android studio环境配置不再赘述,可以参照我的其他博客. Android应用程序开发环境搭建:http://blog.csdn.net/ja33son/article/details/61 ...
- 11G新特性 -- Result Cache
共享池存放sql语句的解析和编译版本,以便数据库能快速执行频繁执行的sql语句和plsql. 在11g中,数据库使用result cache来存放sql和plsql的执行结果. result cach ...
- 复习下C 链表操作(双向循环链表,查找循环节点)
双向循环链表 和 单向循环链表 查找循环节点 思路都是一样. 快慢指针查找法. 理论可参考 c 链表之 快慢指针 查找循环节点 typedef struct Student_Double { ]; ...
- DNS-320 B2 语言包
神一样的NAS啊,这个语言包在这里http://tsd.dlink.com.tw/downloads2008detailgo.asp,选择sc的就可以了. 真是神一样的配置~ 佩服死d-link了
- Eclipse和MyEclipse工程描述符.classpath和.project和.mymetadata详解(转)
转自:http://blog.csdn.net/zygsee/archive/2009/12/22/5046100.aspx 有时候在一个Java工程里我们需要加入第三方jar包,这时你加入的最好相对 ...
- 《转》Babel 入门教程
ECMAScript 6是JavaScript语言的下一代标准,已经在2015年6月正式发布了.Mozilla公司将在这个标准的基础上,推出JavaScript 2.0.ES6的目标,是使得JavaS ...
- 【XMPP】基于XMPP的即时通讯解决方案
什么是XMPP 介绍XMPP之前,先来看看GTalk. GTalk是Google推出的IM(Instant Messaging,即时通讯)软件,类似于QQ和MSN. 从技术角度来说,GTalk与QQ和 ...
- Android Launcher分析和修改10——HotSeat深入进阶
前面已经写过Hotseat分析的文章,主要是讲解如何在Launcher里面配置以及修改Hotseat的参数.今天主要是讲解一下如何在Hotseat里面的Item显示名称.这个小问题昨天折腾了半天,最后 ...
- Java编程的逻辑 (82) - 理解ThreadLocal
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- JavaScript高级用法三之浏览器对象
综述 本篇的主要内容来自慕课网,内置对象,主要内容如下 1 window对象 2 JavaScript 计时器 3 计时器setInterval() 4 取消计时器clearInterval() 5 ...