3224: Tyvj 1728 普通平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 10097  Solved: 4302
[Submit][Status][Discuss]

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.每个数的数据范围:[-1e7,1e7]
数据如下http://pan.baidu.com/s/1jHMJwO2

一万年没写数据结构了,来发treap模板练练手/
 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 110010
#define llg int
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
int n,m,ans; inline int getint()
{
int w=,q=;
char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar();
if (c=='-') q=, c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar();
return q ? -w : w;
} struct MYTREAP
{
int root,size;
struct
{
int l,r,rnd,val,w,size;
}po[maxn]; void init(){ memset(po,,sizeof(po)); root=size=;} void update(llg now) {po[now].size=po[po[now].l].size+po[po[now].r].size+po[now].w;} void right_(llg &now) {llg t=po[now].l; po[now].l=po[t].r; po[t].r=now; po[t].size=po[now].size; update(now); now=t;}
void left_(llg &now) {llg t=po[now].r; po[now].r=po[t].l; po[t].l=now; po[t].size=po[now].size; update(now); now=t;} void in(llg val)
{
insert(root,val);
} void insert(llg &now,llg val)
{
if (now==)
{
now=++size;
po[now].size=po[now].w=; po[now].val=val; po[now].rnd=rand();
return ;
}
po[now].size++;
if (po[now].val==val)
{
po[now].w++;
}
else
if (po[now].val<val)
{
insert(po[now].r,val);
if (po[po[now].r].rnd<po[now].rnd) left_(now);
}
else
{
insert(po[now].l,val);
if (po[po[now].l].rnd<po[now].rnd) right_(now);
}
} void del(llg &now,llg val)
{
if (now==) return ;
if (po[now].val==val)
{
if (po[now].w>)
{
po[now].w--; po[now].size--;
return ;
}
if (po[now].l*po[now].r==) now=po[now].l+po[now].r;
else
{
if (po[po[now].l].rnd<po[po[now].r].rnd) right_(now); else left_(now);
del(now,val);
}
}
else
{
po[now].size--;
if (val>po[now].val) del(po[now].r,val);
else del(po[now].l,val);
}
} int ask_rank(llg now,llg val)
{
if (now==) return ;
if (po[now].val==val) return po[po[now].l].size+;
else
if (val>po[now].val) return po[po[now].l].size+po[now].w+ask_rank(po[now].r,val);
else return ask_rank(po[now].l,val);
} int ask_num(llg now,int val)
{
if (now==) return ;
if (val<=po[po[now].l].size)
return ask_num(po[now].l,val);
else if (val>po[po[now].l].size+po[now].w)
return ask_num(po[now].r,val-po[po[now].l].size-po[now].w);
else
return po[now].val;
} void pre(llg now,llg val)
{
if (now==) return ;
if (po[now].val<val)
{
ans=now;
pre(po[now].r,val);
}
else pre(po[now].l,val);
} void nex(llg now,llg val)
{
if (now==) return ;
if (po[now].val>val)
{
ans=now;
nex(po[now].l,val);
}
else nex(po[now].r,val);
} }tree; int main()
{
yyj("");
srand();
tree.init();
cin>>n;
llg ty,x;
for (llg i=;i<=n;i++)
{
ty=getint(),x=getint();
switch(ty)
{
case :tree.in(x);break;
case :tree.del(tree.root,x);break;
case :printf("%d\n",tree.ask_rank(tree.root,x));break;
case :printf("%d\n",tree.ask_num(tree.root,x));break;
case :ans=;tree.pre(tree.root,x);printf("%d\n",tree.po[ans].val);break;
case :ans=;tree.nex(tree.root,x);printf("%d\n",tree.po[ans].val);break;
}
}
return ;
}
 
 

【bzoj】3224: Tyvj 1728 普通平衡树的更多相关文章

  1. BZOJ 3224: Tyvj 1728 普通平衡树

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9629  Solved: 4091[Submit][Sta ...

  2. BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 7390  Solved: 3122 [Submit][S ...

  3. BZOJ 3224: Tyvj 1728 普通平衡树 treap

    3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...

  4. BZOJ 3224: Tyvj 1728 普通平衡树 vector

    3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...

  5. BZOJ 3224: Tyvj 1728 普通平衡树(BST)

    treap,算是模板题了...我中间还一次交错题... -------------------------------------------------------------------- #in ...

  6. BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 22483  Solved: 10130[Submit][S ...

  7. BZOJ 3224 Tyvj 1728 普通平衡树模板

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 题目大意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以 ...

  8. bzoj 3224: Tyvj 1728 普通平衡树 && loj 104 普通平衡树 (splay树)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 思路: splay树模板题: 推荐博客:https://blog.csdn.ne ...

  9. bzoj 3224/Tyvj 1728 普通平衡树(splay)

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...

  10. fhq_treap || BZOJ 3224: Tyvj 1728 普通平衡树 || Luogu P3369 【模板】普通平衡树

    题面:[模板]普通平衡树 代码: #include<cstdio> #include<cstring> #include<iostream> #include< ...

随机推荐

  1. POJ1062:昂贵的聘礼(枚举+迪杰斯特拉)

    http://poj.org/problem?id=1062 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为 ...

  2. 浅谈远程登录时,ssh的加密原理

    SSH:Secure Shell,是一种网络安全协议,主要用于登录远程计算机的加密过程. 登录方式主要有两种: 1.基于用户密码的登录方式:   加密原理:   当服务器知道用户请求登录时,服务器会把 ...

  3. 浅谈Android View事件分发机制

    引言 前面的文章介绍了View的基础知识和View的滑动,今天我们来介绍View的另一个核心知识,View的事件分发机制. 点击事件的传递规则 所谓的点击事件的分发机制,其实就是对MotionEven ...

  4. 将Mongo装为Windows的服务

    PHP的mongo扩展: 首先 下载一个PHP的mongo扩展, 地址:http://download.csdn.net/detail/qq_36387589/9819259 然后修改php.ini. ...

  5. linux du df ls

    du可以查看文件和文件夹的大小,df主要查看数据库大小,查看分区的的磁盘使用情况,ls可以添加-h参数,方便我们查看文件大小 df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为 ...

  6. acrobat pro 无法编辑个别文本

    在修改pdf文档时出现个别文字选取不上,无法修改,如图中4-2626没有选中 解决方法如图 此后可以直接修改文本了

  7. ARM_Core的处理器模式与寄存器,结构杂谈

    ARM处理器的工作状态:ARM处理器有两种工作状态.在程序的执行过程中,处理器可以在两种工作状态之间切换,并且不影响 相应寄存器中的内容. ARM状态,此时处理器执行32位对齐的ARM指令:BX指令, ...

  8. JVM内存模型:程序计数器

    一.JVM模型概述 java虚拟机(JVM)在java程序运行的过程中,会将它所管理的内存划分为若干个不同的数据区域,这些区域有的随着JVM的启动而创建,有的随着用户线程的启动和结束而建立和销毁.一个 ...

  9. iostat使用

    iostat -k 查看io的iowait值是否高 iotop 查看具体是哪个组件在占用io. iostat -x -x代表显示一些扩展参数. %util:一秒中有百分之多少的时间用于 I/O 操作, ...

  10. 【转】SQL Server、Oracle、MySQL和Vertica数据库常用函数对比

    SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 1. 绝对值 S:select abs(-1) valu ...