#include #include #include namespace { struct range_t { int start; int end; range_t(int start, int end) : start(start) , end(end) { } bool has(int x) const { return x > start && x < end; } bool operator>(const range_t& other) const { return start > other.start; } bool operator==(const range_t& other) const { return start == other.start && end == other.end; } }; bool overlaps(const range_t& a, const range_t& b) { return a == b || a.has(b.start) || a.has(b.end) || b.has(a.start) || b.has(a.end); } } // namespace class MyCalendar { std::vector entries; public: MyCalendar() = default; bool book(int start, int end) { entries.emplace_back(start, end); auto it = entries.end(); it--; for (int i = entries.size() - 1; i > 0 && entries[i - 1] > entries[i]; i--, it--) { if (overlaps(entries[i], entries[i - 1])) { entries.erase(it); return false; } std::swap(entries[i], entries[i - 1]); } if (it > entries.begin() && overlaps(*it, *(it - 1))) { entries.erase(it); return false; } return true; } }; /** * Your MyCalendar object will be instantiated and called as such: * MyCalendar* obj = new MyCalendar(); * bool param_1 = obj->book(start,end); */ static void test_case_1() { std::cout << "=== TEST CASE 1 ===\n"; std::vector entries { { 47, 50 }, { 33, 41 }, { 39, 45 }, { 33, 42 }, { 25, 32 }, { 26, 35 }, { 19, 25 }, { 3, 8 }, { 8, 13 }, { 18, 27 } }; std::vector expected { true, true, false, false, true, false, true, true, true, false }; MyCalendar c; for (auto i = 0; i < entries.size(); i++) { std::cout << "[TEST] Entry #" << i << "\n"; auto [start, end] = entries[i]; assert(c.book(start, end) == expected[i]); std::cout << "[PASS]\n\n"; } } static void test_case_2() { std::cout << "=== TEST CASE 2 ===\n"; std::vector entries { { 37, 50 }, { 33, 50 }, { 4, 17 }, { 35, 48 }, { 8, 25 } }; std::vector expected { true, false, true, false, false }; MyCalendar c; for (auto i = 0; i < entries.size(); i++) { std::cout << "[TEST] Entry #" << i << "\n"; auto [start, end] = entries[i]; assert(c.book(start, end) == expected[i]); std::cout << "[PASS]\n\n"; } } static void test_case_3() { std::cout << "=== TEST CASE 3 ===\n"; std::vector entries { { 20, 29 }, { 13, 22 }, { 44, 50 }, { 1, 7 }, { 2, 10 }, { 14, 20 }, { 19, 25 }, { 36, 42 }, { 45, 50 }, { 47, 50 }, { 39, 45 }, { 44, 50 }, { 16, 25 }, { 45, 50 }, { 45, 50 }, { 12, 20 }, { 21, 29 }, { 11, 20 }, { 12, 17 }, { 34, 40 }, { 10, 18 }, { 38, 44 }, { 23, 32 }, { 38, 44 }, { 15, 20 }, { 27, 33 }, { 34, 42 }, { 44, 50 }, { 35, 40 }, { 24, 31 } }; std::vector expected { true, false, true, true, false, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }; MyCalendar c; for (auto i = 0; i < entries.size(); i++) { std::cout << "[TEST] Entry #" << i << "\n"; auto [start, end] = entries[i]; assert(c.book(start, end) == expected[i]); std::cout << "[PASS]\n\n"; } } int main() { MyCalendar c; assert(c.book(10, 20)); assert(!c.book(15, 25)); assert(c.book(20, 30)); test_case_1(); test_case_2(); test_case_3(); return 0; }