123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #include <algorithm>
- #include <vector>
- #include <iostream>
- using std::make_pair;
- using std::pair;
- using std::vector;
- using std::cout; using std::endl;
- class RangeModule {
- public:
- RangeModule() {
- }
- void addRange(int left, int right) {
- vector<pair<int, int> > result;
- auto it = segments.begin();
- for (; it != segments.end() && it->first < left; ++it);
- segments.insert(it, make_pair(left, right));
- for (it = segments.begin(); it != segments.end(); ++it) {
- if (result.size() == 0 || result.back().second < it->first)
- result.push_back(*it);
- else
- result.back().second = std::max(result.back().second, it->second);
- }
- segments = result;
- }
- bool queryRange(int left, int right) {
- for (auto it = segments.begin(); it != segments.end() && left != right; ++it) {
- if (it->second <= left || right <= it->first)
- continue;
- if (it->first <= left && right <= it->second)
- return true;
- if (left < it->first)
- return false;
- left = std::min(it->second, right);
- }
- return left == right;
- }
- void removeRange(int left, int right) {
- vector<pair<int, int> > result;
- for (auto it = segments.begin(); it != segments.end(); ++it) {
- if (right <= it->first || it->second <= left) {
- result.push_back(*it);
- continue;
- }
- if (left <= it->first && it->second <= right)
- continue;
- if (it->first < left)
- result.push_back(make_pair(it->first, left));
- if (right < it->second)
- result.push_back(make_pair(right, it->second));
- }
- segments = result;
- }
- void printRange() {
- for (auto it = segments.begin(); it != segments.end(); ++it)
- cout << it->first << ":" << it->second << "; ";
- cout << endl;
- }
- private:
- vector<pair<int, int> > segments;
- };
- /**
- * Your RangeModule object will be instantiated and called as such:
- * RangeModule* obj = new RangeModule();
- * obj->addRange(left,right);
- * bool param_2 = obj->queryRange(left,right);
- * obj->removeRange(left,right);
- */
- // 0 < left < right < 10^9 in all calls to addRange, queryRange, removeRange
- // 1000000000
- int main() {
- RangeModule *obj = new RangeModule();
- obj->addRange(6, 8);
- obj->removeRange(7, 8);
- obj->removeRange(8, 9);
- obj->addRange(8, 9);
- obj->removeRange(1, 3);
- obj->printRange();
- obj->addRange(1, 8);
- obj->printRange();
- bool param_1 = obj->queryRange(2, 4) == true;
- bool param_2 = obj->queryRange(2, 9) == true;
- bool param_3 = obj->queryRange(4, 6) == true;
- cout << param_1 << " " << param_2 << " " << param_3 << endl;
- return 0;
- }
|