bzoj 3224/Tyvj 1728 普通平衡树(splay)
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
10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
Sample Output
106465
84185
492737
HINT
1.n的数据范围:n<=100000
2.每个数的数据范围:[-2e9,2e9]
题解:平衡树裸题,我立志挖个写splay详解博客的坑,鬼知道省选之后会不会退役,反正难填
代码如下:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 500010
using namespace std; struct Splay
{
int son[N][],fa[N],key[N],cnt[N],size[N],rt,sz,pos;
inline void push(int x)
{
size[x]=size[son[x][]]+size[son[x][]]+cnt[x];
}
inline void rotate(int x)
{
int y=fa[x],z=fa[y],k=(son[y][]==x);
son[z][son[z][]==y]=x;
fa[x]=z;
son[y][!k]=son[x][k];
fa[son[x][k]]=y;
son[x][k]=y;
fa[y]=x;
push(y);
}
inline void splay(int x,int goal)
{
for(;fa[x]!=goal;rotate(x))
{
int y=fa[x],z=fa[y];
if(z!=goal)
{
(son[y][]==x)^(son[z][]==y)?rotate(x):rotate(y);
}
}
push(x);
if(!goal)
{
rt=x;
}
}
inline void find(int x)
{
for(pos=rt;son[pos][x>key[pos]]&&x!=key[pos];pos=son[pos][x>key[pos]]);
splay(pos,);
}
inline void get(int x,int k)
{
find(x);
if(!(key[pos]>x&&k||key[pos]<x&&!k))
{
for(pos=son[pos][k];son[pos][!k];pos=son[pos][!k]);
}
}
inline void insert(int x)
{
int father=;
for(pos=rt;pos&&key[pos]!=x;pos=son[pos][x>key[pos]])
{
father=pos;
}
if(pos)
{
++cnt[pos];
}
else
{
pos=++sz;
son[father][x>key[father]]=pos;
son[pos][]=son[pos][]=;
fa[pos]=father;
key[pos]=x;
cnt[pos]=size[pos]=;
}
splay(pos,);
}
inline void del(int x)
{
get(x,);
int pre=pos;
get(x,);
int next=pos;
splay(pre,);
splay(next,pre);
pos=son[next][];
if(cnt[pos]>)
{
--cnt[pos];
--size[pos];
}
else
{
son[next][]=;
}
push(next);
push(pre);
}
inline void kth(int k)
{
for(pos=rt;;)
{
int y=son[pos][];
if(k>size[y]+cnt[pos])
{
k-=size[y]+cnt[pos];
pos=son[pos][];
}
else
{
if(size[y]<k)
{
return;
}
else
{
pos=y;
}
}
}
}
inline void put_key()
{
printf("%d\n",key[pos]);
}
}splay1; int main()
{
int n,kd,val;
splay1.insert(-1e9);
splay1.insert(1e9);
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&kd,&val);
int x;
switch(kd)
{
case :splay1.insert(val);
break;
case :splay1.del(val);
break;
case :splay1.find(val);
x=splay1.size[splay1.son[splay1.pos][]];
printf("%d\n",x);
break;
case :splay1.kth(val+);
splay1.put_key();
break;
case :splay1.get(val,);
splay1.put_key();
break;
case :splay1.get(val,);
splay1.put_key();
break;
}
}
}
bzoj 3224/Tyvj 1728 普通平衡树(splay)的更多相关文章
- BZOJ 3224 Tyvj 1728 普通平衡树 | Splay 板子+SPlay详细讲解
下面给出Splay的实现方法(复杂度证明什么的知道是 nlogn 就可以啦) 首先对于一颗可爱的二叉查找树,是不能保证最坏nlogn的复杂度(可以想象把一个升序序列插入) (二叉查找树保证左子树元素大 ...
- BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 22483 Solved: 10130[Submit][S ...
- 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 ...
- bzoj 3224: Tyvj 1728 普通平衡树 && loj 104 普通平衡树 (splay树)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 思路: splay树模板题: 推荐博客:https://blog.csdn.ne ...
- BZOJ 3224 Tyvj 1728 普通平衡树模板
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 题目大意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以 ...
随机推荐
- 有限状态机(Finite-state machine, FSM)的C语言实现
有限状态机,也称为FSM(Finite State Machine),其在任意时刻都处于有限状态集合中的某一状态.当其获得一个输入字符时,将从当前状态转换到另一个状态,或者仍然保持在当前状态.任何一个 ...
- java内存基础(一)
博客园 闪存 首页 新随笔 联系 管理 订阅 随笔- 35 文章- 0 评论- 29 关于Java 数组内存分配一点认识 //总结:[ 数组引用变量存储在栈内存中,数组对象存储在堆内存当中.数 ...
- 常用FTP命令 1. 连接ftp服务器
1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...
- 如何判断PHP数组是否为空
PHP判断数组为空首选方法:count($arr),size($arr); $arr=array("");echocount($arr);echo size($arr); //输出 ...
- PCB打样前的注意事项
0.画板前,在制定规则的时候,一定要查看生产厂家的生产工艺. (厂家能打几层板.最小间距.焊盘最小和最大尺寸等等) 1.查看焊盘的孔径是否合适. (检查能否插进去) 2.仔细检查购买的三端器件的引 ...
- 操盘策略:KDJ三线合一 必定孕育大牛股
日周月KDJ指标三周期合一是孕育大牛股的必要条件: 炒股看一下周.月线十分有必要,很多时候,周.月线已经死叉下行,中长线趋势走坏,但日线偏偏发出金叉,K线也走好,量价配合也好,而此时介入,多数情况下就 ...
- log4net 使用总结- (3)在ASP.NET MVC 中使用
把输出到sqlserver数据库中. 输出到数据库中和文件中类似,具体配步骤如下 第一步.创建数据库 CREATE TABLE [dbo].[Log] ( [Id] [int] IDENTITY (1 ...
- mybatis 控制器注解介绍(一)
@RequestMapping("LoginController")public class LoginController { // 路径参数{name}填入用户名,{pass} ...
- python's seventeenth day for me 面向对象
用函数做一个简单的游戏: def Person(name,sex,hp,ad): self = {'name':name,'sex':sex,'hp':hp,'ad':ad} def attack(d ...
- php文件上传总结
前言: 学习php中 1.表单代码: <html> <head> <title>文件上传</title> </head> <body ...