普通平衡树(bzoj 3224)
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
/*
一个平衡树的模板写了一上午了,能犯的错误基本都犯了。。。
首先没加哨兵,再就是删除操作时没有更新sz(这个巨坑),真是长记性了。
*/
#include<cstdio>
#include<iostream>
#define N 100010
using namespace std;
int son[N][],fa[N],val[N],cnt[N],sz[N],m,rt,size; void pushup(int x){
sz[x]=sz[son[x][]]+sz[son[x][]]+cnt[x];
} void rotate(int x,int &k){
int y=fa[x],z=fa[y],l,r;
if(son[y][]==x) l=;else l=;r=l^;
if(y==k) k=x;
else {
if(son[z][]==y) son[z][]=x;
else son[z][]=x;
}
fa[x]=z;fa[y]=x;fa[son[x][r]]=y;
son[y][l]=son[x][r];son[x][r]=y;
pushup(y);pushup(x);
} void splay(int x,int &k){
while(x!=k){
int y=fa[x],z=fa[y];
if(y!=k){
if((son[y][]==x)^(son[z][]==y)) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
} void insert(int v){
int k=rt,y=;
while(k&&val[k]!=v) y=k,k=son[k][v>val[k]];
if(k) cnt[k]++;
else {
k=++size;sz[k]=;cnt[k]=;fa[k]=y;val[k]=v;
if(y) son[y][v>val[y]]=k;
}
splay(k,rt);
} void find1(int v){//查找v的位置
int k=rt;if(!k)return;
while(son[k][v>val[k]]&&val[k]!=v)
k=son[k][v>val[k]];
splay(k,rt);
} int find2(int x){//查找排名为x的数
x++;
int k=rt;
if(sz[k]<x)return ;
while(){
if(sz[son[k][]]<x&&sz[son[k][]]+cnt[k]>=x) return k;
if(sz[son[k][]]>=x) k=son[k][];
else x-=(sz[son[k][]]+cnt[k]),k=son[k][];
}
return k;
} int nxt(int x,int f){
find1(x);
if((val[rt]>x&&f)||val[rt]<x&&!f) return rt;
int p=son[rt][f];
while(son[p][f^]) p=son[p][f^];
return p;
} void del(int v){
find1(v);
int x=rt,k;
if(cnt[x]>){cnt[x]--;sz[x]--;return;}
if(!son[x][]||!son[x][]){
rt=son[x][]+son[x][];
}
else {
k=son[x][];
while(son[k][])k=son[k][];sz[k]+=sz[son[x][]];
fa[son[x][]]=k;son[k][]=son[x][];
rt=son[x][];
}
fa[rt]=;splay(k,rt);
} int main(){
insert(-0x7fffffff);insert(0x7fffffff);
scanf("%d",&m);
for(int i=;i<=m;i++){
int opt,x;scanf("%d%d",&opt,&x);
if(opt==) insert(x);
if(opt==) del(x);
if(opt==) find1(x),printf("%d\n",sz[son[rt][]]);
if(opt==) printf("%d\n",val[find2(x)]);
if(opt==) printf("%d\n",val[nxt(x,)]);
if(opt==) printf("%d\n",val[nxt(x,)]);
}
return ;
}
普通平衡树(bzoj 3224)的更多相关文章
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- BZOJ 3224 普通平衡树(Treap模板题)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 14301 Solved: 6208 [Submit][ ...
- BZOJ 3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9629 Solved: 4091[Submit][Sta ...
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 7390 Solved: 3122 [Submit][S ...
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
- BZOJ 3224: Tyvj 1728 普通平衡树 vector
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
- BZOJ 3224: Tyvj 1728 普通平衡树(BST)
treap,算是模板题了...我中间还一次交错题... -------------------------------------------------------------------- #in ...
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [替罪羊树]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- BZOJ 3224 - 普通平衡树 - [Treap][Splay]
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3224 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...
- BZOJ 3224 Tyvj 1728 普通平衡树模板
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 题目大意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以 ...
随机推荐
- Tcl介绍和基础语法
Tcl的背景 Tcl(读作tickle)诞生于80年代的加州大学伯克利分校,作为一种简单高效可移植性好的脚本语言,目前已经广泛应用在几乎所有的EDA工具中.Tcl 的最大特点就是其语法格式极其简单,采 ...
- K-means算法Java实现
public class KMeansCluster { private int k;//簇的个数 private int num = 100000;//迭代次数 ...
- 手写MVVM框架 之vue双向数据绑定原理剖析
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- LibreOJ #109. 并查集
题目描述 这是一道模板题. 维护一个 nnn 点的无向图,支持: 加入一条连接 uuu 和 vvv 的无向边 查询 uuu 和 vvv 的连通性 由于本题数据较大,因此输出的时候采用特殊的输出方式:用 ...
- 51nod 1031 骨牌覆盖
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 在2*N的一个长方形方格中,用一个1*2的骨牌排满方格. 问有多少种不同的排列方法. 例如: ...
- 解决python pip安装提示"not a supported wheel on this platform"
python下载.whl安装文件后使用pip安装有时候会提示报错"xxxxx not a supported wheel on this platform",应该是下载的库文件版本 ...
- 用Python爬取智联招聘信息做职业规划
上学期在实验室发表时写了一个爬取智联招牌信息的爬虫. 操作流程大致分为:信息爬取——数据结构化——存入数据库——所需技能等分词统计——数据可视化 1.数据爬取 job = "通信工程师&qu ...
- sqlit3事务
事务定义了一组SQL命令的边界,这组命令或者作为一个整体被全部执行,或者都不执行.事务的典型实例是转帐. 事务的范围 事务由3个命令控制:BEGIN.COMMIT和ROLLBACK.BEGIN开始一个 ...
- oracle的Hint
与优化器模式相关的Hint 1 ALl_ROWS 让优化器启用CBO /*+ all_rows */ 2 first_rows(n) 让优化器启用CBO 模式,而且得到目标sql的执行计 ...
- class 写在 import的位置 类的名字第一个字母大写 后面没括号 ES6
class 写在 import的位置 类的名字第一个字母大写 后面没括号 class ObTableDataClass {}或者 const ObTableDataClass = class { in ...