【深基16.例7】普通二叉树(简化版)
题目描述
您需要写一种数据结构,来维护一些数(都是绝对值 1 0 9 10^9 109 以内的数)的集合,最开始时集合是空的。其中需要提供以下操作,操作次数 q q q 不超过 1 0 4 10^4 104:
- 定义数 x x x 的排名为集合中小于 x x x 的数的个数 + 1 +1 +1。查询数 x x x 的排名。注意 x x x 不一定在集合里。
- 查询排名为 x ( x ≥ 1 ) x(x\ge 1) x(x≥1) 的数。保证集合里至少有 x x x 个数。
- 求 x x x 的前驱(前驱定义为小于 x x x,且最大的数)。若不存在则输出 − 2147483647 -2147483647 −2147483647。
- 求 x x x 的后继(后继定义为大于 x x x,且最小的数)。若不存在则输出 2147483647 2147483647 2147483647。
- 插入一个数 x x x,本题的数据保证插入前 x x x 不在集合中。
保证执行 1 , 3 , 4 1,3,4 1,3,4 操作时,集合中有至少一个元素。
输入格式
第一行是一个整数 q q q,表示操作次数。
接下来 q q q 行,每行两个整数 o p , x op,x op,x,分别表示操作序号以及操作的参数 x x x。
输出格式
输出有若干行。对于操作 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4,输出一个整数,表示该操作的结果。
样例 #1
样例输入 #1
7
5 1
5 3
5 5
1 3
2 2
3 3
4 3
样例输出 #1
2
3
1
5
问题链接: P5076 普通二叉树(简化版)
问题分析: 二叉树问题,不解释。
参考链接: (略)
题记: (略)
AC的C++语言程序如下:
/* P5076 普通二叉树(简化版) */
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
const int INF = 0x7FFFFFFF;
int main()
{
multiset<int> st;
st.insert(-INF);
st.insert(INF);
int q, op, x;
cin >> q;
while (q--) {
cin >> op >> x;
if (op == 1) {
int order = 0;
auto pos = st.lower_bound(x);
for (auto it = st.begin(); it != pos; it++) order++;
cout << order << endl;
} else if (op == 2) {
int order = -1;
for (int k:st)
if (++order == x)
cout << k << endl;
} else if (op == 3) {
auto pos = st.lower_bound(x);
cout << *--pos << endl;
} else if (op == 4)
cout << *st.upper_bound(x) << endl;
else
st.insert(x);
}
return 0;
}