
#include <iostream>
#include <string>
#include <set>
#include <cmath>
using namespace std;
class Member
{
public:
int id, power;
public:
Member(int _id, int _power) : id(_id), power(_power) {}
friend bool operator<(const Member &ls, const Member &rs)
{
return ls.power < rs.power;
}
friend ostream &operator<<(ostream &os, const Member &m)
{
os << m.id;
return os;
}
bool operator==(const Member &rs)
{
return this->id == rs.id;
}
};
int main(int argc, char const *argv[])
{
multiset<Member> mem_set;
mem_set.insert({1, 1000000000});
int n;
cin >> n;
while (n--)
{
int id, power;
cin >> id >> power;
Member new_mem{id, power};
mem_set.insert(new_mem);
auto lower_iter = mem_set.lower_bound(new_mem);
auto upper_iter = mem_set.upper_bound(new_mem);
if (lower_iter == mem_set.begin()) // if this mem's power is the lowest
cout << new_mem << " " << *upper_iter << endl;
else if (upper_iter == mem_set.end()) // if no mem's power is higher than this mem
cout << new_mem << " " << *(--lower_iter) << endl;
else
{
if (new_mem == *lower_iter)
--lower_iter;
if ((new_mem.power - lower_iter->power) > (upper_iter->power - new_mem.power))
cout << new_mem << " " << *upper_iter << endl;
else
cout << new_mem << " " << *lower_iter << endl;
}
}
return 0;
}
lower_bound
和 upper_bound
两个方法返回的迭代器的值域要搞清楚- 代码中要重载Member这个类的“<”运算符,一定要声明为友元或者是const函数
- 如果重载为普通的成员函数,在g++下面编译不过,原因目前为止