题目描述
新年到了,你的好友和你(共K个人)的周围满是礼物,你让你的好友先拿,但是每个人只能拿当前离自己最近的礼物[当然如果有并列的多个礼物离你的距离相等(精确到小数点后四位,所有运算均为去尾),这些礼物就都属于这个人]。现在你们所在的位置是原点(0,0),每个礼物的位置用坐标表示。现在告诉你每个礼物的坐标,还有每个礼物是谁送的。要你找出你的礼物离你多远,你能拿到多少礼物,这些礼物是谁送的。如果你拿不到礼物,请输出“555…”。
输入描述
第1行:N和K分别表示礼物的个数和人数(K≤N≤100000);
第2到N+1行:每行先是赠送礼品人的姓名,然后是礼物的坐标(x,y)(坐标绝对值小于10^6)。数据间用空格分开。
输出描述
第1行:D和U表示礼物距你多远(只要去尾后的整数)和你能拿到多少礼物。
第2到U+1行:每行一个人名,表示送礼的人(按照输入的顺序输出)。
//分析:
/*
对成员按距离排序
二分查找相同距离区间的右边界
更新top指针,最后输出
*/
#include<bits/stdc++.h>
using namespace std;
int n,k;
double x,y;
struct node {
char name[20];
long long l;
} a[100001];
bool cmp(node a,node b) {
return a.l<b.l;
}
int f_ind(int l,int r,int t) {
int mid;
while(l!=r) {
mid=(l+r)/2;
if(a[mid].l==t)
l=mid+1;
else
r=mid;
}
return l;
}//二分函数
int main() {
cin>>n>>k;
for(int i=1; i<=n; i++)
cin>>a[i].name>>x>>y,a[i].l=10000*sqrt(x*x+y*y);
sort(a+1,a+1+n,cmp);
int top=1;
while(--k) {
top=f_ind(top,n,a[top].l);
if(top==n)
return printf("555...");
}
int t=a[top].l;
int cnt=f_ind(top,n,t)-top;
cout<<t/10000<<" "<<cnt<<"\n";
for(int i=top; cnt; cnt--,i++) {
cout<<a[i].name<<"\n";
}
return 0;
}