BZOJ3224普通平衡树【Splay】
3224: Tyvj 1728 普通平衡树
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 11751 Solved: 5013
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
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
Sample Output
84185
492737
HINT
#include<iostream> #include<cstdio> using namespace std; ; ,root=; inline void update(int x) { size[x]=num[x]; if(lch[x])size[x]+=size[lch[x]]; if(rch[x])size[x]+=size[rch[x]]; } inline void zig(int x)///x==lch[f] { int f=F[x],gf=F[f]; F[f]=x; F[x]=gf; if(gf) if(lch[gf]==f) lch[gf]=x;else if(rch[gf]==f) rch[gf]=x; lch[f]=rch[x]; F[rch[x]]=f; rch[x]=f; update(f); update(x); } inline void zag(int x)///x==rch[f] { int f=F[x],gf=F[f]; F[f]=x; F[x]=gf; if(gf) if(lch[gf]==f) lch[gf]=x;else if(rch[gf]==f) rch[gf]=x; rch[f]=lch[x]; F[lch[x]]=f; lch[x]=f; update(f); update(x); } inline void splay(int x) { int f,gf; ) { f=F[x]; gf=F[f]; ) { if(x==lch[f]) zig(x); else zag(x); break; } if(f==lch[gf]&&x==lch[f]){zig(f);zig(x);} else if(f==rch[gf]&&x==rch[f]){zag(f);zag(x);} else if(f==rch[gf]&&x==lch[f]){zig(x);zag(x);} else{zag(x);zig(x);} } root=x; } inline int find(int x) { int p=root; while(x!=key[p]) { if(x<key[p]) { ) break; else p=lch[p]; } else { ) break; else p=rch[p]; } } return p; } inline void ins(int x) { ) { key[++sz]=x; size[]=; num[]=; root=; F[sz]=; return; } int p=find(x); if(key[p]!=x) { key[++sz]=x; num[sz]=; F[sz]=p; if(x<key[p]) lch[p]=sz; else rch[p]=sz; lch[sz]=rch[sz]=; p=sz; } num[p]++; update(p); update(F[p]); splay(p); } inline int findmax(int p) { ) p=rch[p]; return p; } inline int findmin(int p) { ) p=lch[p]; return p; } inline void del(int x) { int p=find(x); splay(p); num[p]--; ) { int f=F[p]; ) {root=rch[p];F[rch[p]]=;} ) {root=lch[p];F[lch[p]]=;} else { int l=findmax(lch[p]),r=rch[p]; F[lch[p]]=; splay(l); rch[l]=r; F[r]=l; update(l); } } } inline int findn(int x,int p) { if(size[lch[p]]<x&&x<=size[lch[p]]+num[p]) return p; else if(x<=size[lch[p]]) return findn(x,lch[p]); else if(rch[p]) return findn(x-size[lch[p]]-num[p],rch[p]); } int main() { int t,n,p,x; scanf("%d",&n); ;i<=n;i++) { scanf("%d%d",&t,&x); ) ins(x); ) del(x); ) {splay(find(x));printf();} ) printf("%d\n",key[findn(x,root)]); ) {ins(x);printf("%d\n",key[findmax(lch[root])]);del(x);} ) {ins(x);printf("%d\n",key[findmin(rch[root])]);del(x);} } ; }
BZOJ3224普通平衡树【Splay】的更多相关文章
- bzoj3224 普通平衡树(splay 模板)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 11427 Solved: 4878[Submit][St ...
- BZOJ3224:普通平衡树(Splay)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...
- [luogu3369/bzoj3224]普通平衡树(splay模板、平衡树初探)
解题关键:splay模板题整理. 如何不加入极大极小值?(待思考) #include<cstdio> #include<cstring> #include<algorit ...
- bzoj3224 普通平衡树 splay模板
题目传送门 题目大意:完成一颗splay树. 思路:模板题,学着还是很有意思的. 学习splay树:蒟蒻yyb 该题模板:汪立超 #include<bits/stdc++.h> #defi ...
- 【BZOJ3224】Tyvj 1728 普通平衡树 Splay
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- BZOJ3224/洛谷P3391 - 普通平衡树(Splay)
BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...
- 【转】 史上最详尽的平衡树(splay)讲解与模板(非指针版spaly)
ORZ原创Clove学姐: 变量声明:f[i]表示i的父结点,ch[i][0]表示i的左儿子,ch[i][1]表示i的右儿子,key[i]表示i的关键字(即结点i代表的那个数字),cnt[i]表示i结 ...
- hiho #1329 : 平衡树·Splay
#1329 : 平衡树·Splay 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. ...
- Hihocoder 1329 平衡树·Splay(平衡树)
Hihocoder 1329 平衡树·Splay(平衡树) Description 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. 小Hi:怎么了? 小Ho:小H ...
- 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay
[阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...
随机推荐
- 使用光盘iso实现Linux操作系统的自动安装部署
前边写了一篇使用 PXE 的方式批量安装操作系统,不是任何时候任何地方都有环境来通过 PXE 方式来进行安装.如果此时需要通过光盘安装,默认的情况下是通过交互式方式进行安装,其实也可以通过 kicks ...
- Codeforce 水题报告
最近做了好多CF的题的说,很多cf的题都很有启发性觉得很有必要总结一下,再加上上次写题解因为太简单被老师骂了,所以这次决定总结一下,也发表一下停课一星期的感想= = Codeforces 261E M ...
- 【java基础之jdk源码】Object
最新在整体回归下java基础薄弱环节,以下为自己整理笔记,若有理解错误,请批评指正,谢谢. java.lang.Object为java所有类的基类,所以一般的类都可用重写或直接使用Object下方法, ...
- python2.7学习笔记-split用一个分隔符分割、多个分隔符分割、在有汉字存在的情况下split分割
还是直接上程序吧,暂且就叫它为程序吧: ''' 按照多个分隔符分割,split的用法 ''' import re s='hi!chu?lan!heihei' re.split('[!?]',s) '' ...
- Java 同步容器和并发容器
同步容器(在并发下进行迭代的读和写时并不是线程安全的) Vector.Stack.HashTable Collections类的静态工厂方法创建的类(如Collections.synchr ...
- zabbix安装详解
关于zabbix及相关服务软件版本: Linux:centos 6.6 nginx:1.9.15 MySQL:5.5.49 PHP:5.5.35 一.安装nginx: 安装依赖包: yum -y in ...
- Redis Cluster部署、管理和测试
背景: Redis 3.0之后支持了Cluster,大大增强了Redis水平扩展的能力.Redis Cluster是Redis官方的集群实现方案,在此之前已经有第三方Redis集群解决方案,如Twen ...
- 用js,css3 做的一个球
用css3属性很容易做一个立方体,但是要做一个球体,会相对复杂些 原理是:球可以看做是由无数个圆圈构成,然后就可以用圆圈来做球, 下面的例子是我做的一个小球,由72个圆圈组成.如果把每个圆圈的背景颜色 ...
- javascript 常用api
常用API合集 来源于:https://www.kancloud.cn/dennis/tgjavascript/241852 一.节点 1.1 节点属性 Node.nodeName //返回节点名称, ...
- 迷茫<第一篇:初到北京>
时光如梭,毕业四年了,遥想当年刚毕业的场景就像是昨天发生一样,这四年的人生,就是在不停的漂泊,不断的受挫.感慨良多,一言难以说尽. 2013年11月29号毕业,刚到北京的第二天我就顺利的找到了工作, ...