[BZOJ3224]普通平衡树(旋转treap,STL-vector)
3224: Tyvj 1728 普通平衡树
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 20328 Solved: 8979
[Submit][Status][Discuss]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 493598Sample Output
106465
84185
492737HINT
1.n的数据范围:n<=1000002.每个数的数据范围:[-2e9,2e9]Source
刷点模板题。。发现自己treap忘光了。。
没什么好说的,题目里的排名是指从小到大,其余没有什么坑点,那些作为函数哪些作为过程要想清楚。
比无旋treap快,所以说到现在都没有遇上必须用无旋treap的题,除了WC的那道可持久化treap。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std; const int N=,inf=;
int n,rt,nd,ans,op,x,ls[N],rs[N],sz[N],h[N],v[N],w[N]; void rrot(int &x){
int y=ls[x]; ls[x]=rs[y]; rs[y]=x;
sz[y]=sz[x]; sz[x]=sz[ls[x]]+sz[rs[x]]+w[x]; x=y;
} void lrot(int &x){
int y=rs[x]; rs[x]=ls[y]; ls[y]=x;
sz[y]=sz[x]; sz[x]=sz[ls[x]]+sz[rs[x]]+w[x]; x=y;
} void ins(int &x,int k){
if (!x){
x=++nd; v[x]=k; h[x]=rand(); sz[x]=w[x]=; return;
}
sz[x]++;
if (v[x]==k) { w[x]++; return; }
if (k<v[x]){ ins(ls[x],k); if (h[ls[x]]<h[x]) rrot(x);}
else { ins(rs[x],k); if (h[rs[x]]<h[x]) lrot(x); }
} void del(int &x,int k){
if (v[x]==k){
if (w[x]>) { w[x]--; sz[x]--; return; }
if (!ls[x] || !rs[x]) { x=ls[x]+rs[x]; return; }
if (h[ls[x]]<h[rs[x]]) rrot(x),del(x,k); else lrot(x),del(x,k);
return;
}
sz[x]--;
if (k<v[x]) del(ls[x],k); else del(rs[x],k);
} int get(int x,int k){
if (!x) return ;
if (v[x]==k) return sz[ls[x]]+;
else if (k<v[x]) return get(ls[x],k); else return sz[ls[x]]+w[x]+get(rs[x],k);
} int find(int x,int k){
if (!x) return ;
if (sz[ls[x]]+<=k && sz[ls[x]]+w[x]>=k) return v[x];
if (sz[ls[x]]>=k) return find(ls[x],k);
else return find(rs[x],k-sz[ls[x]]-w[x]);
} void pre(int x,int k){
if (!x) return;
if (v[x]<k) ans=max(ans,v[x]),pre(rs[x],k); else pre(ls[x],k);
} void nxt(int x,int k){
if (!x) return;
if (v[x]>k) ans=min(ans,v[x]),nxt(ls[x],k); else nxt(rs[x],k);
} int main(){
freopen("bzoj3224.in","r",stdin);
freopen("bzoj3224.out","w",stdout);
for (scanf("%d",&n); n--; ){
scanf("%d%d",&op,&x);
if (op==) ins(rt,x);
if (op==) del(rt,x);
if (op==) printf("%d\n",get(rt,x));
if (op==) printf("%d\n",find(rt,x));
if (op==) ans=,pre(rt,x),printf("%d\n",ans);
if (op==) ans=inf,nxt(rt,x),printf("%d\n",ans);
}
return ;
}
懒得写这么多怎么办,上STL-vector,所有操作都能在库函数里找到。
据说单次操作理论复杂度是线性的,实际上可以看作是根号的,但这里也只慢了一倍而已。
#include<cstdio>
#include<vector>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std; const int inf=;
int n,op,x;
vector<int>a; int main(){
scanf("%d",&n); a.reserve();
rep(i,,n){
scanf("%d%d",&op,&x);
if (op==) a.insert(upper_bound(a.begin(),a.end(),x),x);
if (op==) a.erase(lower_bound(a.begin(),a.end(),x));
if (op==) printf("%d\n",int(lower_bound(a.begin(),a.end(),x)-a.begin()+));
if (op==) printf("%d\n",a[x-]);
if (op==) printf("%d\n",*(--lower_bound(a.begin(),a.end(),x)));
if (op==) printf("%d\n",*upper_bound(a.begin(),a.end(),x));
}
return ;
}
[BZOJ3224]普通平衡树(旋转treap,STL-vector)的更多相关文章
- BZOJ3224普通平衡树——旋转treap
题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...
- BZOJ3224普通平衡树——非旋转treap
题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...
- 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树
直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势: AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数 ...
- 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)
在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...
- BZOJ3223文艺平衡树——非旋转treap
此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...
- BZOJ3729Gty的游戏——阶梯博弈+巴什博弈+非旋转treap(平衡树动态维护dfs序)
题目描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动到这个节点先手是否有必胜策略.gt ...
- BZOJ3224 Tyvj 1728 普通平衡树(Treap)
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树
二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...
- 4923: [Lydsy1706月赛]K小值查询 平衡树 非旋转Treap
国际惯例的题面:这种维护排序序列,严格大于的进行操作的题都很套路......我们按照[0,k],(k,2k],(2k,inf)分类讨论一下就好.显然第一个区间的不会变化,第二个区间的会被平移进第一个区 ...
随机推荐
- Watchcow(POJ2230+双向欧拉回路+打印路径)
题目链接:http://poj.org/problem?id=2230 题目: 题意:给你m条路径,求一条路径使得从1出发最后回到1,并满足每条路径都恰好被沿着正反两个方向经过一次. 思路:由于可以回 ...
- 【HNOI】矩阵染色 数论
[题目描述]一个2*i的矩阵,一共有m种颜色,相邻两个格子颜色不能相同,m种颜色不必都用上,f[i]表示这个答案,求Σf[i]*(2*i)^m (1<=i<=n)%p. [数据范围] 20 ...
- Webview 中FaultyInfo代码说明
class FaultyInfoHandler(tornado.web.RequestHandler): def get(self): import xmlrpc.client s = xmlrpc. ...
- ribbon设置url级别的超时时间
序 ribbon的超时设置,只能按转发的serviceId来分的,无法像nginx那样直接在每个转发的链接里头设置超时时间.这里hack一下,实现url基本的ribbon超时时间设置.具体的思路就是重 ...
- 安装FFMpeg CentOS 7
https://linuxadmin.io/install-ffmpeg-on-centos-7/
- Python模块学习 - Functools
Functools模块 Higher-order functions and operations on callable objects,看这个标题我都是懵逼的,这都是啥啥啥啊,赶紧拿出百度翻译:可 ...
- 【Python学习笔记】Pandas库之DataFrame
1 简介 DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表. 或许说它可能有点像matlab的矩阵,但是matlab的矩阵只能放数值型值(当然matla ...
- Laravel 5.2 数据库迁移和数据填充
一.数据库迁移 Laravel 的数据库迁移提供了对数据库.表.字段.索引的一系列相关操作.下面以创建友情链接表为例. 1. 创建迁移 使用 Artisan 命令 php artisan make: ...
- nodejs 优雅的连接 mysql
1.mysql 及 promise-mysql nodejs 连接 mysql 有成熟的npm包 mysql ,如果需要promise,建议使用 promise-mysql: npm:https:// ...
- const 引用的分析
const 引用: 在初始化常量引用时,允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可.尤其,允许为一个常量引用绑定非常量的对象.字面值,甚至是一个表达式.我们来看 const ...