715.cc 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <algorithm>
  2. #include <vector>
  3. #include <iostream>
  4. using std::make_pair;
  5. using std::pair;
  6. using std::vector;
  7. using std::cout; using std::endl;
  8. class RangeModule {
  9. public:
  10. RangeModule() {
  11. }
  12. void addRange(int left, int right) {
  13. vector<pair<int, int> > result;
  14. auto it = segments.begin();
  15. for (; it != segments.end() && it->first < left; ++it);
  16. segments.insert(it, make_pair(left, right));
  17. for (it = segments.begin(); it != segments.end(); ++it) {
  18. if (result.size() == 0 || result.back().second < it->first)
  19. result.push_back(*it);
  20. else
  21. result.back().second = std::max(result.back().second, it->second);
  22. }
  23. segments = result;
  24. }
  25. bool queryRange(int left, int right) {
  26. for (auto it = segments.begin(); it != segments.end() && left != right; ++it) {
  27. if (it->second <= left || right <= it->first)
  28. continue;
  29. if (it->first <= left && right <= it->second)
  30. return true;
  31. if (left < it->first)
  32. return false;
  33. left = std::min(it->second, right);
  34. }
  35. return left == right;
  36. }
  37. void removeRange(int left, int right) {
  38. vector<pair<int, int> > result;
  39. for (auto it = segments.begin(); it != segments.end(); ++it) {
  40. if (right <= it->first || it->second <= left) {
  41. result.push_back(*it);
  42. continue;
  43. }
  44. if (left <= it->first && it->second <= right)
  45. continue;
  46. if (it->first < left)
  47. result.push_back(make_pair(it->first, left));
  48. if (right < it->second)
  49. result.push_back(make_pair(right, it->second));
  50. }
  51. segments = result;
  52. }
  53. void printRange() {
  54. for (auto it = segments.begin(); it != segments.end(); ++it)
  55. cout << it->first << ":" << it->second << "; ";
  56. cout << endl;
  57. }
  58. private:
  59. vector<pair<int, int> > segments;
  60. };
  61. /**
  62. * Your RangeModule object will be instantiated and called as such:
  63. * RangeModule* obj = new RangeModule();
  64. * obj->addRange(left,right);
  65. * bool param_2 = obj->queryRange(left,right);
  66. * obj->removeRange(left,right);
  67. */
  68. // 0 < left < right < 10^9 in all calls to addRange, queryRange, removeRange
  69. // 1000000000
  70. int main() {
  71. RangeModule *obj = new RangeModule();
  72. obj->addRange(6, 8);
  73. obj->removeRange(7, 8);
  74. obj->removeRange(8, 9);
  75. obj->addRange(8, 9);
  76. obj->removeRange(1, 3);
  77. obj->printRange();
  78. obj->addRange(1, 8);
  79. obj->printRange();
  80. bool param_1 = obj->queryRange(2, 4) == true;
  81. bool param_2 = obj->queryRange(2, 9) == true;
  82. bool param_3 = obj->queryRange(4, 6) == true;
  83. cout << param_1 << " " << param_2 << " " << param_3 << endl;
  84. return 0;
  85. }