[bzoj3196][tyvj1728]普通平衡树
真是太差了,到现在才打出一个平衡树的板子。。
感谢blackjack大佬提供的数组版treap板子!!基本完全照搬,blackjack太神啦!
但目前我只会这几个最基本的操作(说白了STL的(multi)set)也能干。。。
还差的好远-_-
#include<bits/stdc++.h>
#define L T[x].ls
#define R T[x].rs
using namespace std;
const int N=;
int root,sz,ans;
struct Node{
int val,sz,cnt,ls,rs,key;
}T[N];
void ref(int x){
T[x].sz=T[L].sz+T[R].sz+T[x].cnt;
}
void zig(int &x){
int y=R;
T[x].rs=T[y].ls;T[y].ls=x;
T[y].sz=T[x].sz;ref(x);ref(y);x=y;
}
void zag(int &x){
int y=L;
T[x].ls=T[y].rs;T[y].rs=x;
T[y].sz=T[x].sz;ref(x);ref(y);x=y;
}
void ins(int &x,int v){
if(!x){
x=++sz;
T[x]=(Node){v,,,,,rand()};
return;
}
if(T[x].val==v){
T[x].cnt++;T[x].sz++;
return;
}
T[x].sz++;
if(T[x].val<v){
ins(R,v);
if(T[R].key<T[x].key)
zig(x);
}
else{
ins(L,v);
if(T[L].key<T[x].key)
zag(x);
}
}
void del(int &x,int v){
if(!x)return;
if(T[x].val==v){
if(T[x].cnt>){
T[x].cnt--;T[x].sz--;
return;
}
if(!(L*R)){
x=L+R;return;
}
if(T[L].key<T[R].key)
zag(x),del(x,v);
else
zig(x),del(x,v);
}
else{
T[x].sz--;
if(T[x].val<v)del(R,v);
else del(L,v);
}
}
void pre(int x,int v){
if(!x)return;
if(T[x].val<v)
ans=x,pre(R,v);
else pre(L,v);
}
void nxt(int x,int v){
if(!x)return;
if(T[x].val>v)
ans=x,nxt(L,v);
else nxt(R,v);
}
int qnum(int x,int rk){
if(!x)return ;
if(rk<=T[L].sz)
return qnum(L,rk);
if(rk>T[L].sz+T[x].cnt)
return qnum(R,rk-T[L].sz-T[x].cnt);
return T[x].val;
}
int qrank(int x,int v){
if(!x)return ;
if(T[x].val==v)
return T[L].sz+;
if(T[x].val<v)
return qrank(R,v)+T[L].sz+T[x].cnt;
return qrank(L,v);
}
int main(){
int n;scanf("%d",&n);
while(n--){
int opt,t;scanf("%d%d",&opt,&t);
ans=;
switch(opt){
case :ins(root,t);break;
case :del(root,t);break;
case :ans=qrank(root,t);printf("%d\n",ans);break;
case :ans=qnum(root,t);printf("%d\n",ans);break;
case :pre(root,t);printf("%d\n",T[ans].val);break;
case :nxt(root,t);printf("%d\n",T[ans].val);break;
}
}
}
[bzoj3196][tyvj1728]普通平衡树的更多相关文章
- tyvj1728 普通平衡树
为了彻底理解树状数组,试着用树状数组做了下普通平衡树 而树状数组只能离线做,或者保证值的大小在数组可承受的范围内也是可以的,因为要求离线是因为必须事前对所有数离散化. 然后我们看刘汝佳蓝书上的图 利用 ...
- BZOJ3196二逼平衡树——线段树套平衡树(treap)
此为平衡树系列最后一道:二逼平衡树您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询 ...
- bzoj3196 二逼平衡树
题目链接 平衡树系列最后一题 坑啊 10s时间限制跑了9764ms...还是要学一学bit套主席树啦... 经典的线段树套treap...至于第一发为什么要TLE(我不会告诉你treap插入的时候忘了 ...
- 【bzoj3224】 Tyvj1728—普通平衡树
http://www.lydsy.com/JudgeOnline/problem.php?id=3224 (题目链接) 题意 1. 插入x数:2. 删除x数(若有多个相同的数,因只删除一个):3. 查 ...
- BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)
我实在是不想再打一遍树状数组套替罪羊树了... 然后在普通平衡树瞎逛的时候找到了以前看过vector题解 于是我想:为啥不把平衡树换成vector呢??? 然后我又去学了一下ZKW线段树 就用ZKW线 ...
- bzoj3196 二逼平衡树 树状数组套线段树
题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...
- BZOJ3196 二逼平衡树 【线段树套平衡树】
题目 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查询k在区间内的前驱(前驱 ...
- bzoj3196 二逼平衡树 树套树(线段树套Treap)
Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4697 Solved: 1798[Submit][Status][D ...
- 初学 Size Balanced Tree(bzoj3224 tyvj1728 普通平衡树)
SBT(Size Balance Tree), 即一种通过子树大小(size)保持平衡的BST SBT的基本性质是:每个节点的size大小必须大于等于其兄弟的儿子的size大小: 当我们插入或者删除一 ...
随机推荐
- python模块详解 hashlib
hashlib模块 用于加密相关的操作,在python3中替代了md5和sha模块,主要提供SHA和MD5算法. MD5 import hashlib m = hashlib.md5() #调用md5 ...
- hibernate_HelloWorld
环境准备 1.下载 hibernate 3.3.2: 2.下载 hibernate 3.4.0: 3.注意阅读 hibernate compatibility matrix(hibernate 网站, ...
- lucene中文学习地址推荐
Lucene原理与代码分析http://www.cnblogs.com/forfuture1978/category/300665.html Lucene5.5学习(1)-初尝Lucene全文检索引擎 ...
- shell脚本学习(3)文件判断
shell常用的文件判断运算符如下: -e 文件是否存在 -f 文件是否是普通文件(不是目录.设备文件.链接文件) -s 表示文件大小不为0 -d 表示文件是否是目录 -b 表示是块设备(光驱.软 ...
- javascript中的循环引用对象处理
先说明一下什么是循环引用对象: var a={"name":"zzz"}; var b={"name":"vvv"}; ...
- 整数N分解,搭积木,离散数学中的母函数,ZOJ(1163)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1163 解题报告: 将整数N分解为:两个及以上的不重复的整数,最流 ...
- eclips新建Maven Web项目
一.创建项目 1.Eclipse中用Maven创建项目 上图中Next 2.继续Next 3.选maven-archetype-webapp后,next 4.填写相应的信息,Packaged是默认创建 ...
- nodejs 的一些PHP函数库
http://locutus.io/php/ nodejs 的一些PHP函数库 PHP extensions in JavaScript array array_change_key_case arr ...
- 2017.10.23 Java 面向对象深入学习---final 关键字、static关键字、匿名对象等
今日内容介绍 1.final 关键字 2.static 关键字 3.匿名对象 4.内部类 5.包的声明与访问 6.访问修饰符 7.代码块 第一节课 01(面向对象)final关键字概念.avi 02: ...
- [USACO07FEB]银牛派对Silver Cow Party---最短路模板题
银牛排队 对于我这种蒟蒻来说,还是不要跑一次单元最短路.跑两次好写呀(- ̄▽ ̄)- 而题目中是有向图.如果如果按照题意进行最短路的话.就会出现一个单终点最短路和一个单起点最短路 对于单起点自然就是套模 ...