image.png

    1. #include <iostream>
    2. #include <string>
    3. #include <set>
    4. #include <cmath>
    5. using namespace std;
    6. class Member
    7. {
    8. public:
    9. int id, power;
    10. public:
    11. Member(int _id, int _power) : id(_id), power(_power) {}
    12. friend bool operator<(const Member &ls, const Member &rs)
    13. {
    14. return ls.power < rs.power;
    15. }
    16. friend ostream &operator<<(ostream &os, const Member &m)
    17. {
    18. os << m.id;
    19. return os;
    20. }
    21. bool operator==(const Member &rs)
    22. {
    23. return this->id == rs.id;
    24. }
    25. };
    26. int main(int argc, char const *argv[])
    27. {
    28. multiset<Member> mem_set;
    29. mem_set.insert({1, 1000000000});
    30. int n;
    31. cin >> n;
    32. while (n--)
    33. {
    34. int id, power;
    35. cin >> id >> power;
    36. Member new_mem{id, power};
    37. mem_set.insert(new_mem);
    38. auto lower_iter = mem_set.lower_bound(new_mem);
    39. auto upper_iter = mem_set.upper_bound(new_mem);
    40. if (lower_iter == mem_set.begin()) // if this mem's power is the lowest
    41. cout << new_mem << " " << *upper_iter << endl;
    42. else if (upper_iter == mem_set.end()) // if no mem's power is higher than this mem
    43. cout << new_mem << " " << *(--lower_iter) << endl;
    44. else
    45. {
    46. if (new_mem == *lower_iter)
    47. --lower_iter;
    48. if ((new_mem.power - lower_iter->power) > (upper_iter->power - new_mem.power))
    49. cout << new_mem << " " << *upper_iter << endl;
    50. else
    51. cout << new_mem << " " << *lower_iter << endl;
    52. }
    53. }
    54. return 0;
    55. }
    • lower_boundupper_bound 两个方法返回的迭代器的值域要搞清楚
    • 代码中要重载Member这个类的“<”运算符,一定要声明为友元或者是const函数
      • 如果重载为普通的成员函数,在g++下面编译不过,原因目前为止