1:冷血格斗场
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
为了迎接08年的奥运会,让大家更加了解各种格斗运动,facer新开了一家冷血格斗场。格斗场实行会员制,但是新来的会员不需要交入会费,而只要同一名老会员打一场表演赛,证明自己的实力。
我们假设格斗的实力可以用一个正整数表示,成为实力值,两人的实力值可以相同。另外,每个人都有一个唯一的id,也是一个正整数。为了使得比赛更好看,每一个新队员都会选择与他实力最为接近的人比赛,即比赛双方的实力值之差的绝对值越小越好,如果有多个人的实力值与他差别相同,则他会选择id最小的那个。
不幸的是,Facer一不小心把比赛记录弄丢了,但是他还保留着会员的注册记录。现在请你帮facer恢复比赛纪录,按照时间顺序依次输出每场比赛双方的id。
输入
-
第一行一个数n(0 < n <=100000),表示格斗场新来的会员数(不包括facer)。以后n行每一行两个数,按照入会的时间给出会员的id和实力值。一开始,facer就算是会员,id为1,实力值1000000000。
输出
-
N行,每行两个数,为每场比赛双方的id,新手的id写在前面。
样例输入
-
3 2 3 3 1 4 2
样例输出
-
2 1 3 2 4 2
-
using namespace std; #include<iostream> #include<map> #include<vector> #include<fstream> int abs(int a) { return a > 0 ? a : -a; } map<int, int> a; void findafter(vector<pair<int,int>>&b, map<int, int>::iterator p,int temp,int strength){ while ((p != a.end()) && (abs(p->first - strength) == temp)) { b.push_back(*p); p++; }} void findbefore(vector<pair<int, int>>&b, map<int, int>::iterator p1, int temp, int strength) { while ((p1 != a.begin()) && (abs(strength - p1->first) == temp)) { b.push_back(*p1); p1--; } if (p1 == a.begin() && (abs(strength - p1->first) == temp)) b.push_back(*p1); } void fight(int id, int strength) { int id1 = 100000000; map<int, int>::iterator p = a.lower_bound(strength); if (p == a.begin())//所有老会员实力都大于新会员 { vector<pair<int, int>> b; int temp = (p->first - strength); findafter(b, p, temp, strength); for (auto e : b) { if (e.second < id1) id1 = e.second; } } else { map<int, int>::iterator p1 = --p; p++; if (p == a.end()) { vector<pair<int, int>> c; int temp =abs( strength - p1->first); findbefore(c, p1, temp, strength); for (auto e : c) { if (e.second < id1) id1 = e.second; } } else { int temp =abs (p->first - strength); if (temp > abs(strength-p1->first)) { id1 = p1->second; } else if (temp < abs(strength - p1->first)) { id1 = p->second; } else { vector<pair<int,int>> d; findbefore(d, p1, temp, strength); findafter(d, p, temp, strength); for (auto e : d) { if (e.second < id1) id1 = e.second; }} }} printf("%d %d\n", id, id1); } int main() { int n; cin >> n; //scanf_s("%d", &n); int id, strength; a.insert(pair<int, int>(1000000000, 1)); for (int i = 1; i <= n; i++) { //scanf_s("%d %d", &id, &strength); cin >> id >> strength; fight( id, strength); auto it = a.find(strength); if (it == a.end() || it->second>id) a[strength] = id; } }