
#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++下面编译不过,原因目前为止