[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)分类讨论一下就好.显然第一个区间的不会变化,第二个区间的会被平移进第一个区 ...
随机推荐
- jQuery操作Table学习总结[转]
<style type="text/css"> .hover { } </style>< ...
- HDU 1070 Milk (模拟)
题目链接 Problem Description Ignatius drinks milk everyday, now he is in the supermarket and he wants to ...
- javascript中数据属性与访问器属性
1.数据属性 Configurable:true|false,表示能否通过delete将属性删除,默认为true.当把属性的Configurable设置为false后,该属性不能通过delete删除, ...
- Linux中source命令的用法
source命令: source命令也称为“点命令”,也就是一个点符号(.).source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录.因为linux所有的操作都会变成文 ...
- Java案例之随机验证码功能实现
实现的功能比较简单,就是随机产生了四个字符然后输出.效果图如下,下面我会详细说一下实现这个功能用到了那些知识点,并且会把 这些知识点详细的介绍出来.哈哈 ,大神勿喷,对于初学Java的人帮助应该蛮大的 ...
- elk + suricata 实验环境详细安装教程
1.安装运行suricata,需要*** sudo add-apt-repository ppa:oisf/suricata-stable sudo apt-get update sudo apt-g ...
- JS阶段测试
JS阶段测试 一.选择题 1.表单中的数据要提交到的处理文件由表单的( c )属性指定. A. method B. name C. action D. 以上都不对 2.在CSS样式 ...
- python实战===itchat
import itchat itchat.login() friends=itchat.get_friends(update=True)[0:] male=female=other=0 for i i ...
- python近期遇到的一些面试问题(二)
1. 解释什么是栈溢出,在什么情况下可能出现. 栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,将会溢出缓冲区的范围.在Python中, ...
- CSS原生布局方式
前言 网页原生布局的方法其实网上有很多,大概为Flow(流动布局模型).Float(浮动布局模型).Layer(层级布局模型).<!--more--> Flow布局 流动布局模型其实就是默 ...