先排序然后二分查找临界点。
AC代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define ll long long
#define inf 999999999
using namespace std;
int n;
struct node
{
string name;
string id;
int num;
};
node a[1000000];
bool cmp(node x,node y)
{
return x.num>y.num;
}
int f(int x)
{
int q=0,w=n-1;
while(q<=w)
{
int mid=(q+w)/2;
if(a[mid].num>x)
{
q=mid+1;
}
else if(a[mid].num<x)
{
w=mid-1;
}
else
{
return mid;
}
}
return q;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
cin>>a[i].name>>a[i].id>>a[i].num;
}
int l,r;
scanf("%d %d",&l,&r);
sort(a,a+n,cmp);
int res=f(r);
int flag=0;
for(int i=res;;i++)
{
if(a[i].num>=l)
{
cout<<a[i].name<<" "<<a[i].id<<endl;
flag=1;
}
else
{
break;
}
}
if(flag==0)
{
printf("NONE\n");
}
}