BZOJ3224 Tyvj 1728 普通平衡树(Treap)
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。
本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!
题目链接:BZOJ3224
正解:$Treap$
解题报告:
$Treap$其实就是二叉搜索树啦,加入了随机化权值之后可以保证树的形态比较平衡。
$Treap$既是一棵二叉搜索树又是一个大根堆(小根堆也行,随意啦),每次$insert$了之后给这个节点$rand$一个权值就好了,然后每次需要保证堆的性质,所以要维护一个向上旋转的操作。
这就是旋转式的$Treap$了,挺simple的。
//It is made by ljh2000
//有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <complex>
#include <bitset>
using namespace std;
typedef long long LL;
typedef long double LB;
typedef complex<double> C;
const double pi = acos(-1);
const int MAXN = 100011;
int n,rt,tot,tr[MAXN][2],size[MAXN],r[MAXN],val[MAXN];
//维护按权值的二叉搜索树,同时是随机权值的大根堆
//相等的均靠左
inline void update(int x){ size[x]=size[tr[x][0]]+size[tr[x][1]]+1; }
inline int getint(){
int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
} inline void R(int &p,bool k){//把x的左/右儿子旋转上来
int t=tr[p][k]; tr[p][k]=tr[t][k^1]; tr[t][k^1]=p;
update(p); update(t); p=t;
} inline void insert(int &p,int x){
if(!p) { p=++tot; val[p]=x; size[p]=1; r[p]=rand(); return ; }
size[p]++;//!!!
if(x<=val[p]) insert(tr[p][0],x); else insert(tr[p][1],x);
bool k=(x>val[p]);
if(r[ tr[p][k] ] > r[p]) R(p,k);//不满足大根堆性质,往上旋转
} inline void out(int &p){//删除当前节点,不断旋转,直到没有左儿子或者没有右儿子就可以结束了
if(!tr[p][0] || !tr[p][1]) { p=tr[p][0]+tr[p][1]; return ; }
bool k=(r[ tr[p][1] ]>r[ tr[p][0] ]);//把key偏大的那个儿子旋转上来
R(p,k); size[p]--;//!!!
out(tr[p][k^1]);
} inline void del(int &p,int k){//把当前子树中rank为k的结点删除
size[p]--;//!!!在最前面呀...
if(size[tr[p][0]]+1==k) { out(p); return ; }
if(size[tr[p][0]]>=k) del(tr[p][0],k);
else del(tr[p][1]/*!!!*/,k-size[tr[p][0]]-1);
} inline int kth(int x,int k){//查询rank为k的数,rank最小的那个
while(x) {
if(size[tr[x][0]]+1==k) return val[x];
if(k<=size[tr[x][0]]) x=tr[x][0];
else k-=size[tr[x][0]]+1,x=tr[x][1];
}
return 0;
} inline int rank(int x,int k){//查询>=k的第一个数的rank,最靠左的那个
int tot=1;
while(x) {
if(k<=val[x]) x=tr[x][0];
else tot+=size[tr[x][0]]+1,x=tr[x][1];
}
return tot;
} inline void work(){
srand(23333);
n=getint(); int type,x;
while(n--) {
type=getint(); x=getint();
if(type==1) {
insert(rt,x);
}
else if(type==2) {
del(rt,rank(rt,x));
}
else if(type==3) {
printf("%d\n",rank(rt,x));
}
else if(type==4) {
printf("%d\n",kth(rt,x));
}
else if(type==5) {
printf("%d\n", kth( rt, rank(rt,x)-1 ) );
}
else {
printf("%d\n", kth( rt, rank(rt,x+1) ) );
}
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("3224.in","r",stdin);
freopen("3224.out","w",stdout);
#endif
work();
return 0;
}
//有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
BZOJ3224 Tyvj 1728 普通平衡树(Treap)的更多相关文章
- [BZOJ3224] [Tyvj 1728] 普通平衡树 (treap)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- bzoj3224: Tyvj 1728 普通平衡树(平衡树)
bzoj3224: Tyvj 1728 普通平衡树(平衡树) 总结 a. cout<<(x=3)<<endl;这句话输出的值是3,那么对应的,在splay操作中,当父亲不为0的 ...
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 7390 Solved: 3122 [Submit][S ...
- bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5354 Solved: 2196[Submit][Sta ...
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
- bzoj3224: Tyvj 1728 普通平衡树(splay)
3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: #include<cstdio> #include<cstring> ...
- 【权值线段树】bzoj3224 Tyvj 1728 普通平衡树
一个板子. #include<cstdio> #include<algorithm> using namespace std; #define N 100001 struct ...
- BZOJ3224——Tyvj 1728 普通平衡树
1.题目大意:数据结构题,是treap,全都是treap比较基本的操作 2.分析:没啥思考的 #include <cstdio> #include <cstdlib> #inc ...
随机推荐
- BBS项目部署之数据库的处理
一 数据库的处理: 1.1上传bbs.sql(数据库中的数据) 1.2在mysql中创建bbs库,并导入数据库SQL脚本 在mysqld的文件夹中: mysql> create databas ...
- python一两行代码完成的骚操作
分享一个前几天晚上粉丝问的问题,觉得很实用的一个问题,用python读取Excel并保存字典,如何做? 下面是该同学问题截图和代码 代码截图是下面这样的 不知道大家第一眼看了这个代码,什么感受 ...
- python学习笔记(十八)网络编程之requests模块
上篇博客中我们使用python自带的urllib模块去请求一个网站,或者接口,但是urllib模块太麻烦了,传参数的话,都得是bytes类型,返回数据也是bytes类型,还得解码,想直接把返回结果拿出 ...
- H5移动端的一些坑、、、
H5项目常见问题及注意事项 Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 //一.HTML页面结构 <meta name="viewport" co ...
- B-、B+、B*树
B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点:所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中: B+树:在B-树基础上,为叶子结点增加链表指针, ...
- (转)CreateThread与_beginthread,内存泄漏为何因(原帖排版有些不好 ,所以我稍微整理下)
在写c++代码时,一直牢记着一句话:决不应该调用CreateThread. 应该使用Visual C++运行时库函数_beginthreadex.好像CreateThread函数就 ...
- Python(进程线程)
一 理论基础: ''' 一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理.调度进程,并且将多个进程对硬件的竞争变得有序 二 多道技术: 1.产生背景:针对单核,实现并发 ...
- Python(异常处理)
一 错误和异常 程序中难免出现错误,而错误分成两种 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) 2.逻辑错误(逻辑错误) 什么是异常 异常就是程序运行时发 ...
- cocoon + carrierwave 多图片上传用法
gem 'cocoon' gem 'carrierwave' gem 'mini_magick' 1.图片上传carrierwave配置,github 自己手动添加的配置,没用命令生成 在app下新建 ...
- JMS API(二)
JMS 公共API 接口共7个: 1.ConnectionFactory 2.Destination 3.Connection 4.Session 5.Message 6.MessageProduce ...