/*
树状数组+二分
题意是要求你自己创造一种容器,满足三种操作,这些操作可以用树状数组实现,
第三种操作要求 求大于k的第k小的数,用二分即可找到
*/
#include <iostream>
#include <cstdio>
using namespace std;
int a[100001];
int maxn=100000;
inline int lowbit(int x)
{
return x&(-x);
}
void up(int x,int val)
{
for(; x<=maxn; x+=lowbit(x)) a[x]+=val;
}
int query(int x)
{
int sum=0;
for(; x>0; x-=lowbit(x)) sum+=a[x];
return sum;
}
int _find(int a,int b)
{
int l=a;//从a到maxn查找
int r=maxn;
int as=query(a);
while(l<=r)
{
int mid=(l+r)/2;
if(query(mid)-as<b)//as是前a项的和,用前mid项的和减as就是a到as项的个数和
l=mid+1;
else r=mid-1;
}
return l;
}
int main()
{
int jug,T,i,p,x,a1,a2;
while(~scanf("%d",&T))
{
memset(a,0,sizeof(a));
while(T--)
{
scanf("%d",&p);
if(p==0)
{
scanf("%d",&p);
up(p,1);
}
else if(p==1)
{
scanf("%d",&p);
if(query(p)-query(p-1)!=0)
{
up(p,-1);
}
else
printf("No Elment!\n");
}
else if(p==2)
{
scanf("%d %d",&a1,&a2);
if(query(maxn)-query(a1)>=a2)//只有当 大于a的数的个数和都大于或等于k 才能找到
{
printf("%d\n",_find(a1,a2));
}
else printf("Not Find!\n");
}
}
}
return 0;
}
HDU 2852 KiKi's K-Number 二分+树状数组
最新推荐文章于 2020-12-27 19:27:03 发布