本题利用map打标记,利用set存储力量值,利用set的lower_bound来查找和输入的力量值接近力量,然后通过set输出id值即可,注意用printf优化
//@author:hairu,wu
//@from:ahut
#include<iostream>
#include<map>
#include<cmath>
#include<set>
using namespace std;
const int max_n=1e9;
int n;
int main(){
cin >> n;
map<int,int> m;//power,id
set<int> s;
m[max_n]=1;
s.insert(max_n);//初始
for(int i=0;i<n;i++){
int id,power;
scanf("%d %d",&id,&power);
set<int>::iterator pos,pos1;
pos=s.lower_bound(power);
if(pos==s.begin()){
printf("%d %d\n",id,m[*pos]);
} else if(pos==s.end()){
printf("%d %d\n",id,m[*(s.rbegin())]);
}else{
pos--;
pos1=pos;
pos++;
if(abs(*pos1-power) < abs(*pos - power)){
printf("%d %d\n",id,m[*pos1]);
}else if(abs(*pos1-power) > abs(*pos - power)){
printf("%d %d\n",id,m[*pos]);
}else{
if(m[*pos1] < m[*pos]){
printf("%d %d\n",id,m[*pos1]);
}else{
printf("%d %d\n",id,m[*pos]);
}
}
}
s.insert(power);
if(m[power]>0){
if(id<m[power]){ //保证每种能量只保留ID最小的人
m[power]=id;
}
}else{
m[power]=id;
}
}
return 0;
}