题目描述

这是一道模板题。

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:

  1. 插入  x 数;
  2. 删除  x 数(若有多个相同的数,因只删除一个);
  3. 查询  x 数的排名(若有多个相同的数,因输出最小的排名);
  4. 查询排名为 x 的数;
  5. 求 x 的前趋(前趋定义为小于 x,且最大的数);
  6. 求 x 的后继(后继定义为大于 x,且最小的数)。

输入格式

第一行为 n,表示操作的个数,下面 n 行每行有两个数 opt 和 x, 表示操作的序号(1<=opt<=6)。

输出格式

对于操作 3、4、5、6 每行输出一个数,表示对应答案。

样例

样例输入

10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598

样例输出

106465
84185
492737

数据范围与提示

 1<=n<=105,-107<=x<=107
 ___________________________________________________________________________
 
fhq_treap模板
___________________________________________________________________________
  1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1e5+10;
4 struct node
5 {
6 int val,lc,rc,siz,rd;
7 }tr[maxn];
8 int cnt,root,n;
9 int newnode(int v)
10 {
11 ++cnt;
12 tr[cnt].val=v;
13 tr[cnt].siz=1;
14 tr[cnt].rd=rand();
15 tr[cnt].lc=tr[cnt].rc=0;
16 return cnt;
17 }
18 void update(int cur)
19 {
20 tr[cur].siz=tr[tr[cur].lc].siz+tr[tr[cur].rc].siz+1;
21 }
22 int merge(int x,int y)
23 {
24 if(x*y==0)return x+y;
25 if(tr[x].rd<tr[y].rd)
26 {
27 tr[x].rc=merge(tr[x].rc,y);
28 update(x);
29 return x;
30 }
31 else
32 {
33 tr[y].lc=merge(x,tr[y].lc);
34 update(y);
35 return y;
36 }
37 }
38 void split(int cur,int v,int &x,int &y)
39 {
40 if(!cur)x=y=0;
41 else
42 {
43 if(tr[tr[cur].lc].siz+1<=v)
44 {
45 x=cur;
46 split(tr[cur].rc,v-tr[tr[cur].lc].siz-1,tr[cur].rc,y);
47 update(cur);
48 }
49 else
50 {
51 y=cur;
52 split(tr[cur].lc,v,x,tr[cur].lc);
53 update(cur);
54 }
55 }
56 }
57 void splitv(int cur,int v,int &x,int &y)
58 {
59 if(!cur)x=y=0;
60 else
61 {
62 if(tr[cur].val<=v)
63 {
64 x=cur;
65 splitv(tr[cur].rc,v,tr[cur].rc,y);
66 update(cur);
67 }
68 else
69 {
70 y=cur;
71 splitv(tr[cur].lc,v,x,tr[cur].lc);
72 update(cur);
73 }
74 }
75 }
76 void insert(int v)
77 {
78 int x,y;
79 splitv(root,v,x,y);
80 root=merge(merge(x,newnode(v)),y);
81 }
82 void del(int v)
83 {
84 int x,y,z;
85 splitv(root,v,x,z);
86 splitv(x,v-1,x,y);
87 y=merge(tr[y].lc,tr[y].rc);
88 root=merge(merge(x,y),z);
89 }
90 void find(int v)
91 {
92 int x,y;
93 splitv(root, v-1,x,y);
94 printf("%d\n",tr[x].siz+1);
95 root=merge(x,y);
96 }
97 void kth(int now,int v)
98 {
99 int cur=now;
100 if(v>tr[now].siz || v<1)return ;
101 while(cur)
102 {
103 if(tr[tr[cur].lc].siz+1==v)
104 {
105 printf("%d\n",tr[cur].val);
106 return ;
107 }
108 else if(tr[tr[cur].lc].siz >= v)cur=tr[cur].lc;
109 else
110 {
111 v-=tr[tr[cur].lc].siz+1;
112 cur=tr[cur].rc;
113 }
114 }
115 }
116 void pre(int v)
117 {
118 int x,y,z;
119 splitv(root,v-1,x,y);
120 kth(x,tr[x].siz);
121 root=merge(x,y);
122 }
123 void next(int v)
124 {
125 int x,y,z;
126 splitv(root,v,x,y);
127 kth(y,1);
128 root=merge(x,y);
129 }
130 int main()
131 {
132 scanf("%d",&n);
133 for(int op,x,i=0;i<n;++i)
134 {
135 scanf("%d%d",&op,&x);
136 if(op==1)insert(x);
137 else if(op==2)del(x);
138 else if(op==3)find(x);
139 else if(op==4)kth(root,x);
140 else if(op==5)pre(x);
141 else next(x);
142 }
143 return 0;
144 }

LOJ104 普通平衡树的更多相关文章

  1. BZOJ3224/LOJ104 普通平衡树 pb_ds库自带红黑树

    您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x2. 删除x(若有多个相同的数,因只删除一个)3. 查询x的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. ...

  2. BZOJ3224/LOJ104 普通平衡树 treap(树堆)

    您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x2. 删除x(若有多个相同的数,因只删除一个)3. 查询x的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. ...

  3. [BZOJ3223]Tyvj 1729 文艺平衡树

    [BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...

  4. [BZOJ3224]Tyvj 1728 普通平衡树

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

  5. BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3595  Solved: 2029[Submit][Sta ...

  6. [普通平衡树treap]【学习笔记】

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

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

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

  8. BZOJ 3223: Tyvj 1729 文艺平衡树

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3628  Solved: 2052[Submit][Sta ...

  9. 【Splay】bzoj3223-Tyvj1729文艺平衡树

    一.题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 ...

随机推荐

  1. [leetcode]53Maximum Subarray动态规划经典题目:最大子串问题

    /** * Find the contiguous subarray within an array (containing at least one number) * which has the ...

  2. [LeetCode]100. Same Tree判断树相同

    dfs遍历一下判断 public boolean isSameTree(TreeNode p, TreeNode q) { if (p==null) { return q == null; } els ...

  3. 【探索之路】机器人篇(2)-ROS系统并创建工作空间和项目

    在ROS官网,已经给出了详细的教程.下面我就般一下砖,把相应的操作写到这里.官方网址:http://wiki.ros.org/cn/ 安装ROS系统 indigo在ubuntu上的安装教程.官网:ht ...

  4. linuix查端口

    根据进程pid查端口:netstat -nap | grep pid 根据端口port查进程:netstat -nap | grep port 根据pid查找文件的启动位置  ps aux | gre ...

  5. Mysql中的语句优化

    1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我们要重点关注的数据: type列,连接类型.一个好的SQL语句至少要 ...

  6. Tensorflow创建已知分布的张量

    一.随机数 tf.random(num) 随机产生返回0----num-1的数 二.图变量 tf.Variable.init(initial_value, trainable=True, collec ...

  7. Linux常用命令(df&dh)

    在Linux下查看磁盘空间使用情况,最常使用的就是du和df了.然而两者还是有很大区别的,有时候其输出结果甚至非常悬殊. du的工作原理 du命令会对待统计文件逐个调用fstat这个系统调用,获取文件 ...

  8. Appium 介绍及环境安装

    Appium是一个可用于测试iOS. Android操作系统和Windows桌面平台原生应用,移动网页应用和混合应用的自动化测试框架. 原生应用(Native App):用 android.iOS或者 ...

  9. js如何替换字符串中匹配到多处中某一指定节点?

    抛出一个问题,如图,搜索关键字,匹配到四处,那我鼠标放在第二处,我想把它变个颜色,该怎么实现呢?回到文章的标题,js如何替换字符串中匹配到多处中某一指定节点? 字符串的替换,我们首先想到的一个属性是r ...

  10. Docker-ce Centos8 笔记一:安装Docker-ce

    Docker是一个建设企业及数据中心服务仓库的进程,通过裸金属机和虚拟机承载的MAC.windows和linux系统提供本地和远程软件服务,涉及应用软件镜像.系统镜像.虚拟化仓库(虚拟机).它承载着灵 ...