題意
少林寺以武僧聞名,每年都有很多年輕人去少林寺出家。少林大師對一個年輕人的評價主要是看他對佛經的理解能力,但也要考慮他的打鬥技巧。當一個年輕人通過了所有的測試並被宣佈爲少林新和尚時,將會有一場戰鬥,作爲歡迎派對的一部分。每個和尚都有一個唯一的身份證和一個唯一的戰鬥等級,都是整數。新和尚必須與戰鬥等級最接近他的老和尚戰鬥。如果有兩個老和尚滿足這一條件,新和尚將採取一個誰的戰鬥等級低於他的。師傅是少林第一和尚,身份證是1,武功等級是1億,剛剛丟失了武功記錄。但他仍然記得誰先加入少林,誰後加入少林。請幫他找回打鬥記錄。
思路
set的二分查找(本來只想寫個水題,看一下我的碼代碼速度,結果wa了好幾發,難受死了)
代碼
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
while(~scanf("%d",&n)){
if(n==0) break;
set<pair<int ,int> > q;
q.insert({1000000000,1});
for(int i=1;i<=n;i++){
int k,g;scanf("%d%d",&k,&g);
pair<int,int> tmp={g,k};
auto x=q.upper_bound(tmp);
if(x==q.begin()){
printf("%d %d\n",k,x->second);
}
else {
auto y=x;
int val1=x->first-g;
y--;
int val2=g-y->first;
if(val1<val2){
printf("%d %d\n",k,x->second);
}
else {
printf("%d %d\n",k,y->second);
}
}
q.insert({g,k});
}
}
// system("pause");
}