题目:
树状数组+二分
ACcode(用cin,cout会T)
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
const int maxn=2e5+5;
int c[maxn]={0};//最大值为sqrt(1e5*1e5*3) =sqrt(3)*1e5
int lowbit(int i)
{
return i&(-i);
}
void update(int k)
{
for(int i=k;i<maxn;i+=lowbit(i))
{
c[i]+=1;//树状数组下标不能为0,特判
if(i==0)
{
return;
}
}
}
int query(int k)
{
int sum=c[0];//树状数组下标不能为0,特判
for(int i=k;i>0;i-=lowbit(i))
{
sum+=c[i];
}
return sum;
}
int main()
{
int n,ans=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int op;
scanf("%d",&op);
if(op==1)
{
double x,y,z;
scanf("%lf%lf%lf",&x,&y,&z);
ans++;
double dis=sqrt(x*x+y*y+z*z);
int p=ceil(dis);//距离为整数,向上取整
update(p);
}else if(op==2)
{
int k;
scanf("%d",&k);
if(ans<k)
{
printf("%d\n",-1);
continue;
}
int l=0,r=maxn,mid;
while(l<=r)//二分查找结果
{
mid=(l+r)>>1;
if(query(mid)>=k)
{
r=mid-1;
}
else
{
l=mid+1;
}
}
printf("%d\n",l);
}
}
}