题意:
少林寺进去一些人,每个人都有对应的id和fight,每个人进去都找跟他fight最近,并且比他早入门的人比武,求每个人比武的对象。。
注意进去人的id是随机的,而且可能有多个人的fight相同。。。。
二分找fight相等的,然后找对应的id。。
#include"stdio.h"
#include"string.h"
#include"algorithm"
using namespace std;
#define N 100005
struct node
{
int id,fight;
int tt;
}A[N];
int n;
int B[N];
int T[N];
bool cmp(node a,node b)
{
if(a.fight!=b.fight)return a.fight<b.fight;
return a.id<b.id;
}
int fun(int t)
{
int x=B[t];
int l,m,h;
l=1;
h=n+1;
while(l<=h)
{
m=(l+h)/2;
if(A[m].fight<x)l=m+1;
else if(A[m].fight>x)h=m-1;
else break;
}
int i;
for(i=m;i<=n+1;i++)
if(A[i].id==t)return i;
for(i=m;i>0;i--)
if(A[i].id==t)return i;
return -1;
}
int main()
{
int i,j;
while(scanf("%d",&n)!=-1&&n)
{
A[1].id=1;
A[1].fight=100000000;
for(i=2;i<=n+1;i++)
{
scanf("%d%d",&T[i],&A[i].fight);
A[i].id=i;
A[i].tt=T[i];
B[i]=A[i].fight;
}
sort(A+1,A+n+2,cmp);
/*
for(i=1;i<=n+1;i++)
printf("%d %d\n",A[i].id,A[i].fight);
*/
int ans;
printf("%d 1\n",T[2]);
for(i=3;i<=n+1;i++)
{
int t=fun(i);
int min=1000000111;
for(j=t-1;j>0;j--)
{
if(A[j].id<A[t].id&&(A[t].fight-A[j].fight<=min))
{
min=A[t].fight-A[j].fight;
ans=j;
}
if(A[t].fight-A[j].fight>min)break;
}
for(j=t+1;j<=n+1;j++)
{
if(A[j].id<A[t].id)
{
if(A[j].fight-A[t].fight<min)
ans=j;
break;
}
}
printf("%d %d\n",T[i],A[ans].tt);
}
}
return 0;
}