版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40924940/article/details/84926320
三种操作
0 加入一个数 x 进入集合
1 去除一个数 x 从集合中(如果没有这个数输出 No elment)ps:我感觉这个出题人单词拼错了
2 查询比 x 大 的第 k 个数
树状数组解决,然而如果暴力遍历会超时,就用二分查找二者之间相差的数个数是否大于 k 就好了。。。‘
以下是 AC 代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int low(int x){return x&-x;}
const int maxn = 1e5+5;
int num[maxn];
int n;
void add(int x,int v)
{
for(int i=x;i<maxn;i+=low(i))
num[i] += v;
}
int sum(int x)
{
int ans = 0;
for(int i=x;i;i-=low(i))
ans += num[i];
return ans;
}
int main()
{
int m, a, b, c;
while(~ scanf("%d", &m))
{
memset(num, 0, sizeof num);
int cnt = 0;
for(int i = 1; i <= m; i++)
{
scanf("%d%d", &a, &b);
if(a == 0)
{
add(b, 1);
cnt++;
}
else if(a == 1)
{
if(sum(b) == sum(b-1))
printf("No Elment!\n");
else
add(b, -1), cnt--;
}
else
{
scanf("%d", &c);
int res = sum(b);
if(res + c > cnt)
printf("Not Find!\n");
else
{
int l = b, r = maxn - 5, ans;
while(l <= r)
{
int mid = (l + r) >> 1;
if(sum(mid) - res >= c)
{
ans = mid;
r = mid - 1;
}
else
{
l = mid + 1;
}
}
printf("%d\n", ans);
}
}
}
}
return 0;
}