vector
说在前面
普通平衡树
题目描述
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
插入x数
删除x数(若有多个相同的数,因只删除一个)
查询x数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名)
查询排名为x的数
求x的前驱(前驱定义为小于x,且最大的数)
求x的后继(后继定义为大于x,且最小的数)
输入输出格式
输入格式:
第一行为nn,表示操作的个数,下面nn行每行有两个数optopt和xx,optopt表示操作的序号( 1 ≤ o p t ≤ 6 1 \leq opt \leq 6 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
说明
时空限制:1000ms,128M
1.n的数据范围:
n
≤
100000
n \leq 100000
n≤100000
2.每个数的数据范围:
[
−
10
7
,
10
7
]
[-{10}^7, {10}^7]
[−107,107]
来源:Tyvj1728 原名:普通平衡树
代码
滑稽(表情)
因为是从别人那里看到的,所以没好意思挂原创……
但csdn要我贴原文地址,我找不着啊。
所以就原创了。
思路不是我原创的,代码是啊。
#include<cmath>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=500000+2018;
void Read(int & p)
{
p=0;
int f=1;
char c=getchar();
while(c<'0' or c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c<='9' and c>='0')
p=p*10+c-'0',c=getchar();
p*=f;
return ;
}
int n,ask,x;
vector <int> Epic;
int main()
{
Read(n);
Epic.reserve(MAXN);
for(int i=1;i<=n;i++)
{
Read(ask),Read(x);
switch(ask)
{
case 1: Epic.insert(upper_bound(Epic.begin(),Epic.end(),x),x);break;
case 2: Epic.erase(lower_bound(Epic.begin(),Epic.end(),x)); break;
case 3: printf("%d\n",lower_bound(Epic.begin(),Epic.end(),x)-Epic.begin()+1);break;
case 4: printf("%d\n",Epic[x-1]); break;
case 5: printf("%d\n",*--lower_bound(Epic.begin(),Epic.end(),x));break;
case 6: printf("%d\n",*upper_bound(Epic.begin(),Epic.end(),x));break;
}
}
}
luogu上能过。