【模板】普通平衡树(权值splay)
安利splay讲解:
【模板】普通平衡树(luogu)
Description
题目描述
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
- 插入 xx 数
- 删除 xx 数(若有多个相同的数,因只删除一个)
- 查询 xx 数的排名(排名定义为比当前数小的数的个数 +1+1 )
- 查询排名为 xx 的数
- 求 xx 的前驱(前驱定义为小于 xx,且最大的数)
- 求 xx 的后继(后继定义为大于 xx,且最小的数)
输入格式
第一行为 nn,表示操作的个数,下面 nn 行每行有两个数 \text{opt}opt 和 xx,\text{opt}opt 表示操作的序号( 1 \leq \text{opt} \leq 61≤opt≤6 )
输出格式
对于操作 3,4,5,63,4,5,6 每行输出一个数,表示对应答案
Code
- #include <iostream>
- using namespace std;
- const int N=1e5+;
- //1:插入xx数
- //2:删除xx数(若有多个相同的数,因只删除一个)
- //3:查询xx数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名)
- //4:查询排名为xx的数
- //5:求xx的前驱(前驱定义为小于xx,且最大的数)
- //6:求xx的后继(后继定义为大于xx,且最小的数)
- int n,x,opt,cnt[N],size[N],val[N],tot,ch[N][],rt,fa[N];
- struct Splay
- {
- void push_up(int x)
- {
- size[x]=size[ch[x][]]+size[ch[x][]]+cnt[x];
- }
- bool get(int x)
- {
- return x==ch[fa[x]][];
- }
- void clear(int x)
- {
- size[x]=ch[x][]=ch[x][]=cnt[x]=val[x]=fa[x]=;
- }
- void rotate(int x)
- {
- int y=fa[x],z=fa[y],wh=get(x);
- fa[ch[x][wh^]]=y;
- ch[y][wh]=ch[x][wh^];
- ch[x][wh^]=y;
- fa[x]=z,fa[y]=x;
- if(z) ch[z][y==ch[z][]]=x;
- push_up(y),push_up(x);
- }
- void splay(int x)
- {
- for(int f=fa[x];f=fa[x],f;rotate(x))
- if(fa[f]) rotate(get(f)==get(x)?f:x);
- rt=x;
- }
- int nxt()
- {
- int now=ch[rt][];
- while(ch[now][]) now=ch[now][];
- return now;
- }
- int pre()
- {
- int now=ch[rt][];
- while(ch[now][]) now=ch[now][];
- return now;
- }
- int rk(int x)
- {
- int res=,now=rt;
- while()
- {
- if(x<val[now]) now=ch[now][];
- else
- {
- res+=size[ch[now][]];
- if(x==val[now])
- {
- splay(now);
- return res+;
- }
- res+=cnt[now],now=ch[now][];
- }
- }
- }
- int kth(int x)
- {
- int now=rt;
- while()
- {
- if(ch[now][] && x<=size[ch[now][]]) now=ch[now][];
- else
- {
- x-=size[ch[now][]]+cnt[now];
- if(x<=) return val[now];
- now=ch[now][];
- }
- }
- }
- void ins(int x)
- {
- if(!rt)
- {
- rt=++tot,cnt[tot]=,val[tot]=x;
- push_up(tot);
- return ;
- }
- int now=rt,par=;
- while()
- {
- if(val[now]==x)
- {
- cnt[now]++;
- push_up(now),push_up(par);
- splay(now);
- return ;
- }
- par=now,now=ch[now][x>val[now]];
- if(!now)
- {
- cnt[++tot]=,val[tot]=x,fa[tot]=par;
- ch[par][x>val[par]]=tot;
- push_up(tot),push_up(par);
- splay(tot);
- return ;
- }
- }
- }
- void del(int x)
- {
- rk(x);
- if(cnt[rt]>) cnt[rt]--,push_up(rt);
- else if(!ch[rt][] && !ch[rt][]) clear(rt),rt=;
- else if(!ch[rt][])
- {
- int now=rt;
- rt=ch[rt][],fa[rt]=;
- clear(now);
- }
- else if(!ch[rt][])
- {
- int now=rt;
- rt=ch[rt][],fa[rt]=;
- clear(now);
- }
- else
- {
- int x=pre(),now=rt;
- splay(x);
- fa[ch[now][]]=rt;
- ch[rt][]=ch[now][];
- clear(now);
- push_up(rt);
- }
- }
- }tree;
- int main()
- {
- ios::sync_with_stdio(false);
- cin>>n;
- while(n--)
- {
- cin>>opt>>x;
- if(opt==) tree.ins(x);
- else if(opt==) tree.del(x);
- else if(opt==) cout<<tree.rk(x)<<endl;
- else if(opt==) cout<<tree.kth(x)<<endl;
- else if(opt==) tree.ins(x),cout<<val[tree.pre()]<<endl,tree.del(x);
- else if(opt==) tree.ins(x),cout<<val[tree.nxt()]<<endl,tree.del(x);
- }
- return ;
- }
【模板】普通平衡树(权值splay)的更多相关文章
- 【模板】平衡树——Treap和Splay
二叉搜索树($BST$):一棵带权二叉树,满足左子树的权值均小于根节点的权值,右子树的权值均大于根节点的权值.且左右子树也分别是二叉搜索树.(如下) $BST$的作用:维护一个有序数列,支持插入$x$ ...
- [BZOJ3196] 二逼平衡树 [权值线段树套位置平衡树]
题面 洛咕题面 思路 没错我就是要不走寻常路! 看看那些外层位置数据结构,必须二分的,$O(n\log^3 n)$的做法吧! 看看那些cdq分治/树状数组套线段树的,空间$O(n\log^2 n)$挤 ...
- [BZOJ3600] 没有人的算术 [重量平衡树+权值线段树]
题面 传送门 思路 这道题目是陈立杰论文<重量平衡树和后缀平衡树在信息学奥赛中的应用 >中关于重量平衡树维护序列排名算法的一个应用 具体方法为:令根节点保存一个实数区间$[0,1]$ 若当 ...
- cogs 1829. [Tyvj 1728]普通平衡树 权值线段树
1829. [Tyvj 1728]普通平衡树 ★★★ 输入文件:phs.in 输出文件:phs.out 简单对比时间限制:1 s 内存限制:1000 MB [题目描述] 您需要写一种数 ...
- [ZJOI2006]书架(权值splay)
[ZJOI2006]书架(luogu) Description 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看 ...
- luoguP3391[模板]文艺平衡树(Splay) 题解
链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...
- BZOJ_3224 Tyvj 1728 普通平衡树 【离散化+权值线段树】
一 题面 Tyvj 1728 普通平衡树 二 分析 比较明显是可以用平衡二叉搜索树(splay)做的. 用权值线段树做,前提就是要先离散化,因为权值线段树维护的值域信息. 板子. 三 AC代码 #in ...
- 【权值分块】bzoj3224 Tyvj 1728 普通平衡树
权值分块和权值线段树的思想一致,离散化之后可以代替平衡树的部分功能. 部分操作的时间复杂度: 插入 删除 全局排名 全局K大 前驱 后继 全局最值 按值域删除元素 O(1) O(1) O(sqrt(n ...
- [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树
二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...
随机推荐
- codeforces 677D(分层图dp)
Codeforces 677D 传送门:https://codeforces.com/contest/677/problem/D 题意: 给你一个n*m的方格图,每个点有一个权值val,现在要求你从坐 ...
- 利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。
正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的‘好’东西记 ...
- ApkTool工具
ApkTool: 一款很好的反编译工具,支持Linux和Windows. 如何使用: 1:需要一个JAVA环境.由于之前已经装过JAVA 相关JDK,JRE,不赘述. 2:下载ApkTool工具: ...
- Wannafly挑战赛25 因子 [数论]
一.题意 令 X = n!, 给定一大于1的正整数p 求一个k使得 p ^k | X 并且 p ^(k + 1) 不是X的因子 输入为两个数n, p (1e18>= n>= 10000 & ...
- 多线程之美8一 AbstractQueuedSynchronizer源码分析<二>
目录 AQS的源码分析 该篇主要分析AQS的ConditionObject,是AQS的内部类,实现等待通知机制. 1.条件队列 条件队列与AQS中的同步队列有所不同,结构图如下: 两者区别: 1.链表 ...
- pyinstaller打包py脚本Warning:lib not found等相关问题
小爬从使用Pyinstaller打包py为exe文件以来,一直都会碰到Warning:lib not found等相关问题,诸如: 虽然大多数时候,您像我一样忽略这些warning,打包后的exe也能 ...
- 0001 认识WEB( 标准)
认识WEB 1. 认识网页 网页主要由文字.图像和超链接等元素构成.当然,除了这些元素,网页中还可以包含音频.视频以及Flash等. 思考: 网页是如何形成的呢? 总结 网页有图片.链接.文字等元素组 ...
- Asp.net导入Excel并读取数据
protected void Button1_Click(object sender, EventArgs e) { if (station.HasFile == false)//HasFile用来检 ...
- SpringBoot系列——启用https
前言 有时候我们需要使用https安全协议,本文记录在SpringBoot项目启用https 生成证书 自签名证书 使用java jdk自带的生成SSL证书的工具keytool生成自己的证书 1.打开 ...
- $Noip2013/Luogu1966$ 火柴排队 贪心+离散化+逆序对
$Luogu$ $Description$ 给定等长的$a,b$两个序列.每次可以交换一个序列中相邻两个数.求最小的交换次数使得$\sum(a_i-b_i)^2$最小. $Sol$ 交换后的序列一定满 ...