[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大小: 当我们插入或者删除一 ...
随机推荐
- Azure进阶攻略 | 应用流畅运行杜绝超载,自有一套好方法
世界上很多东西,无论交通工具.房屋建筑,甚至计算机程序,在容量方面都存在设计上的理论最大值. 比如火车,正常情况下是这样的.舒适地坐着,安静地读一本书,时不时抬头若有所思地远眺车窗外风景,满满的文艺范 ...
- 数组模拟栈(C语言)
用数组模拟栈的实现: #include <stdio.h> #include <stdlib.h> #define STACK_SIZE 100 typedef struct ...
- innerHTML动态添加html代码和脚本兼容性问题处理方法
给某个元素的innerHTML赋值,并使得值中的js代码有效(兼容多个浏览器) 症状:给某个元素的 innerHTML 设置值时,如果提供的 HTML 代码中包含js脚本,很多时候这些脚本无效,或者在 ...
- IOS SQLite函数总结
SQL语句的种类 ● 数据定义语句(DDL:Data Definition Language) ● 包括create和drop等操作 ● 在数据库中创建新表或删除表(create table或 ...
- OpenCV2马拉松第5圈——线性滤波
收入囊中 这里的非常多内容事实上在我的Computer Vision: Algorithms and ApplicationsのImage processing中都有讲过 相关和卷积工作原理 边界处理 ...
- 2018.8.15 AOP面向切面编程简单理解
在Filter过滤器中 拦截器 表面上看 -拦截器帮我们封装了很多功能 拦截器优秀的设计,可拔插设计 aop思想 在struts2中 归纳总结
- ioc 的好文章 转自 GavinJun
https://www.cnblogs.com/fuchongjundream/p/3873073.html
- Ubuntu 10.04上安装MongoDB
MongoDB是一个可扩展.高性能的下一代数据库.MongoDB中的数据以文档形式存储,这样就能在单个数据对象中表示复杂的关系.文档可能由 以下几 部分组成:独立的基本类型属性.“内嵌文档”或文档数组 ...
- SpringBoot中使用配置文件
一般都是把xml配置文件转换为@Bean的模式,如果非要使用xml配置文件,方式如下: /** * 将配置文件引入springboot */ @Configuration @ImportResourc ...
- 前端jQuery之属性操作
属性操作主要分为四个部分:html属性操作,dom属性操作,类样式操作和值操作 HTML属性操作:属性的读取,设置,以及移除,如attr().removeAttr() DOM属性操作:属性的读取,设置 ...