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. Centos7 Zabbix3.2集群安装

    安装环境:服务器10.80.0.191作为zabbix-server,10.80.0.191-195作为zabbix-agent. [zabbix@miyan ~]$ cat /etc/redhat- ...

  2. POJ:1182 食物链(带权并查集)

    http://poj.org/problem?id=1182 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1 ...

  3. SVM入门——线性分类器的求解,核函数

    一.问题的描述 从最一般的定义上说,一个求最小值的问题就是一个优化问题(也叫寻优问题,更文绉绉的叫法是规划——Programming),它同样由两部分组成,目标函数和约束条件,可以用下面的式子表示: ...

  4. python sys.path[0] 的解释

    sys.path是python的搜索模块的路径集,返回的结果是一个list path[0] 此列表的第一项,path[0],在程序启动时初始化,是包含用来调用Python解释器的脚本的目录.如果脚本目 ...

  5. sql server 视图的操作

    -- 判断要创建的视图名是否存在if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[视图名]') and OBJ ...

  6. 【GISER && Painter】矢量切片(Vector tile)

    说明:本月的主要工作都是围绕制作矢量切片这一个核心问题进行的,所以2月的主题就以这个问题为主,目前分支出来的一些内容主要包括了TMS(Tile map service),OpenLayers3中的Pr ...

  7. 结合ajax 的表单验证

    浪费了我两天的时间 我也是醉了 html  结构 <!-- 密码修改 --> <div class="modal fade" id="operatePa ...

  8. EditPlus 4.3.2583 中文版已经发布

    新的版本提升了括号匹配的性能.请点击页面左上角连接下载.

  9. python print 使用分隔符 或行尾符

    使用print() 函数输出数据,但是想改变默认的分隔符或者行尾符. >>> print('ACME', 50, 91.5) ACME 50 91.5 >>> pr ...

  10. MyEclipse 相关设置

    1. MyElipse复制项目后,修改项目的发布名称的方式.右击你的项目,选择 properties -- > MyElipse -- > web,然后修改名称即可. 2. IDE查看源代 ...