[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大小: 当我们插入或者删除一 ...
随机推荐
- 属性动画 常用属性及View常用方法
View类中,常用于属性动画的属性: translationX and translationY: These properties control where the View is located ...
- 01、Scala介绍与安装
01.Scala介绍与安装 1.1 Scala介绍 Scala是对java语言脚本化,特点是就是使不具备脚本化的java语言能够采用脚本化方式来使用,使其具有脚本语言简单.所见即所得的特点,并且编程效 ...
- linux基础命令-文件查看类命令cat/tac/more/less/tail/head
cat 查看文本文件内容 -b :给每一行编号不包括空白行 -n:给所有行编号 [root@host01 tmp]# cat -An /root/anaconda-ks.cfg # Kickstart ...
- Js arguments.callee();函数自己调用自己
1.阶乘的时候,函数一般要用到递归算法,所以函数内部一定会调用自身 //递归,阶乘 function sum(num){ ) { ; } else{ ); //自己调用自己,递归 } } alert( ...
- Lubuntu , ubuntu 搜索文件
使用命令行方式搜索 $ locate your_filename
- CRM, C4C和Hybris的后台作业
CRM 使用事务码SM36查看CRM系统的后台作业: 举一些例子: ABAP_TEXT_INDEX这个job执行的report是ABAP_DOCU_CREATE_TEXT_INDEX: 负责填充buf ...
- MAC下secureCRT无法保存密码的解决方法
在mac下新安装了secureCRT,取代系统自带的终端工具,主要是为了方便链接服务器.mac下面的secureCRT默认保存不上密码, 我们选择了保存密码后,下次登录还是提示密码错误,需要重新认证输 ...
- numpy中生成随机矩阵并打印出矩阵的shape
from numpy import * c=zeros((4,5)) print c.shape print numpy.random.random((2,3))
- 奇异值分解(SVD)和最小二乘解在解齐次线性超定方程中的应用
奇异值分解,是在A不为方阵时的对特征值分解的一种拓展.奇异值和特征值的重要意义相似,都是为了提取出矩阵的主要特征. 对于齐次线性方程 A*X =0;当A的秩大于列数时,就需要求解最小二乘解,在||X| ...
- NestedScrollView和RecyclerView使用,并设置间距
NestedScrollView和RecyclerView使用,并设置间距: 效果图如下: 1.NestedScrollView 和RecyclerView嵌套问题(类似ScrollView 和lis ...