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 493598

Sample Output

106465
84185
492737

HINT

1.n的数据范围:n<=100000
2.每个数的数据范围:[-2e9,2e9]

Source

 

[Submit][Status][Discuss]

刷点模板题。。发现自己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)的更多相关文章

  1. BZOJ3224普通平衡树——旋转treap

    题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...

  2. BZOJ3224普通平衡树——非旋转treap

    题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...

  3. 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树

    直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势:  AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数 ...

  4. 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)

    在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...

  5. BZOJ3223文艺平衡树——非旋转treap

    此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...

  6. BZOJ3729Gty的游戏——阶梯博弈+巴什博弈+非旋转treap(平衡树动态维护dfs序)

    题目描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动到这个节点先手是否有必胜策略.gt ...

  7. BZOJ3224 Tyvj 1728 普通平衡树(Treap)

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  9. 4923: [Lydsy1706月赛]K小值查询 平衡树 非旋转Treap

    国际惯例的题面:这种维护排序序列,严格大于的进行操作的题都很套路......我们按照[0,k],(k,2k],(2k,inf)分类讨论一下就好.显然第一个区间的不会变化,第二个区间的会被平移进第一个区 ...

随机推荐

  1. 【BZOJ】1270 [BeijingWc2008]雷涛的小猫

    [算法]DP [题解]f1[i]表示第i棵树当前高度能得到的最多果子数 f2[i]表示高度i能得到的最多果子数. 于是有: f1[j]=max(f1[j],f2[i+delta])+mp[j][i]; ...

  2. .NET FrameWork 中的 CTS

    CTS:Common Type System 通用类型系统. 1.不仅可以把C#编译成.Net IL,还支持Basic.Python.Ruby等语言,甚至还支持Java.不同语言中的数据类型定义是不一 ...

  3. PHP练习4 留言板

    一.要求 二.示例页面 三.网页代码及网页显示 1.denglu.php  登录页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...

  4. 数据结构--Avl树的创建,插入的递归版本和非递归版本,删除等操作

    AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树.   2.带有平衡条件:每个结点的左右子树的高度之差的绝对值最多为1(空树的高度为-1).   也就是说,AVL树,本质上 ...

  5. centos7安装libvirt支持xen

    另外还有一个非常棒的用法 假如我要执行iostat这个命令来查看CPU与存储设备状态,可是执行却发现没有这个命令 于是执行yum install iostat,结果说找不到该软件,使用下面的办法可以解 ...

  6. 从LFS官方文档构建完整Linux系统

    从LFS官方文档构建完整Linux系统 http://www.cnblogs.com/sonofdark/p/4962609.html 这不是新手教程!!! Parallels Desktop (为防 ...

  7. 动画基础--基于Core Animation(1)

    1.简介 上一篇文章[New learn]动画-基于UIView了解到了一些直接由UIView这个在UIKIT提供的类中提供的一些动画方法. 使用UIView的动画特性已经能够满足我们很多的需求,它是 ...

  8. RabbitMQ 基础知识

    1. 背景 RabbitMQ 是一个由 erlang 开发的AMQP 开源实现,erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便. 基础概念 讲解基础概念的前面,我们先来整体构造一 ...

  9. POJ 1160 Post Office(DP+经典预处理)

    题目链接:http://poj.org/problem?id=1160 题目大意:在v个村庄中建立p个邮局,求所有村庄到它最近的邮局的距离和,村庄在一条直线上,邮局建在村庄上. 解题思路:设dp[i] ...

  10. [PAT] 1147 Heaps(30 分)

    1147 Heaps(30 分) In computer science, a heap is a specialized tree-based data structure that satisfi ...