题目大意: 说少林寺一个一个来弟子,每次来一个要找一个实力最相近的人和他打一场,输出每次比赛的人,先输出新来的,后输出功力最相近的,如果有两个人一样相近,就取功力比较低的那位(So Sweeeeeet!)。
思路:其实就是一个排序查找+插入维护的问题,但是数据比较大,一看就知道要用log的时间去查找和维护,于是自然想到了二叉平衡树,map容器的底层就是利用类似的方法实现的。调用STL写出来会比较简单。
具体做法,每次出现一个弟子,插入map,再用迭代器找出来,由于map容器自动排序了,++和--可以得到离他最近的两个了(也不与一定是最近的两个,应该说比他小的最近和比他大的最近的两个)……比较一下谁合适就好了。
Code:
#include<iostream>
#include<map>
#include<cstdio>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
map<int ,int >maps;
maps[10000090]=1;
if(n==0)break;
else
{
int a,b;
map<int ,int >::iterator it,it1,it2,it3,it4;
for(int i=1; i<=n; i++)
{
scanf("%d %d",&a,&b);
if(i==1)
{
printf("%d 1\n",a);
maps[b]=a;
}
else
{
maps[b]=a;
it=maps.find(b);
if(it==maps.begin())
{
it++;
}
else
{
it1=it;it2=it;
it1--;
it2++;
if((it->first-it1->first) <= (it2->first-it->first))
it=it1;
else
it=it2;
}
printf("%d %d\n",a,it->second);
}
}
}
}
}