题目描述

这是一道模板题。

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

  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]49. Group Anagrams重排列字符串分组

    是之前的重排列字符串的延伸,判断是重排列后存到HashMap中进行分组 这种HashMap进行分组的方式很常用 public List<List<String>> groupA ...

  2. Git 常用命令 【13个命令包含git 90%的操作】

  3. swing桌面四子棋程序开发过程中遇到的一些问题记录(二)

    第二个遇到的问题是将JButton按钮设置成透明的按钮.首先UI给我一张透明的图片,如果我直接给Button按钮设置背景图片的话,是没有透明的效果的,只会留下白色的底,设置前后的效果如下图 制作透明的 ...

  4. 每日一个linux命令6 -- rmdir

    rmdir doc 如果doc为空目录则删除,否则无法删除. rmdir -p test2/test3 递归删除空目录,首先判断test3,如果test3为空,则删除test3,此时判断test2,如 ...

  5. SpringgBoot父子工程的创建

    知识:SpringBoot父子工程创建 花开堪折直需折,莫待无花空折枝 开始之前,非常非常有必要了解一下关于以及的区别,这样才可以在进行创建maven父子工程种避免一些不必要的意外错误. depend ...

  6. CentOS-8.3.2011-x86_64 配置网络环境的几个方案以及问题处理方法

    1. 在安装前的环境配置中配置网络 可以通过 NETWORK & HOST NAME 进行网络配置, 推介通过这里便捷设置. 如果在安装的 CentOS 之前的配置选项中没有进行用户和网络的配 ...

  7. 如何保持json序列化的顺序性?

    说到json,相信没有人会陌生,我们天天都在用.那么,我们来讨论个问题,json有序吗?是谁来决定的呢?如何保持? 说到底,json是框架还是啥?实际上它只是一个数据格式,一个规范标准,它永远不会限制 ...

  8. Databricks 第四篇:分组统计和窗口

    对数据分析时,通常需要对数据进行分组,并对每个分组进行聚合运算.在一定意义上,窗口也是一种分组统计的方法. 分组数据 DataFrame.groupBy()返回的是GroupedData类,可以对分组 ...

  9. day119:MoFang:宠物的状态改动&宠物粮道具的使用&宠物死亡处理

    目录 1.宠物的状态改动 2.宠物粮道具的使用 3.宠物死亡处理 1.宠物的状态改动 1.在setting表中为每个宠物配置生命周期时间 因为宠物有多个,每个宠物会有不同的初始生命的饥饿时间,所以我们 ...

  10. PHP jquer网页打印插件 PrintArea

    <!DOCTYPE html> <head> <meta charset="utf-8"> <meta http-equiv=" ...