/* * @lc app=leetcode id=732 lang=cpp * * [732] My Calendar III * * https://leetcode.com/problems/my-calendar-iii/description/ * * algorithms * Hard (56.53%) * Likes: 260 * Dislikes: 90 * Total Accepted: 15.2K * Total Submissions: 26.8K * Testcase Example: '["MyCalendarThree","book","book","book","book","book","book"]\n[[],[10,20],[50,60],[10,40],[5,15],[5,10],[25,55]]'
* * Implement a MyCalendarThree class to store your events. A new event can * always be added. * * Your class will have one method, book(int start, int end). Formally, this * represents a booking on the half open interval [start, end), the range of * real numbers x such that start <= x < end. * * A K-booking happens when K events have some non-empty intersection (ie., * there is some time that is common to all K events.) * * For each call to the method MyCalendar.book, return an integer K * representing the largest integer such that there exists a K-booking in the * calendar. * Your class will be called like this: MyCalendarThree cal = new * MyCalendarThree(); MyCalendarThree.book(start, end) * * Example 1: * * * MyCalendarThree(); * MyCalendarThree.book(10, 20); // returns 1 * MyCalendarThree.book(50, 60); // returns 1 * MyCalendarThree.book(10, 40); // returns 2 * MyCalendarThree.book(5, 15); // returns 3 * MyCalendarThree.book(5, 10); // returns 3 * MyCalendarThree.book(25, 55); // returns 3 * Explanation: * The first two events can be booked and are disjoint, so the maximum * K-booking is a 1-booking. * The third event [10, 40) intersects the first event, and the maximum * K-booking is a 2-booking. * The remaining events cause the maximum K-booking to be only a 3-booking. * Note that the last event locally causes a 2-booking, but the answer is still * 3 because * eg. [10, 20), [10, 40), and [5, 15) are still triple booked. * * * * * Note: * * * The number of calls to MyCalendarThree.book per test case will be at most * 400. * In calls to MyCalendarThree.book(start, end), start and end are integers in * the range [0, 10^9]. * * * */// @lc code=startclassMyCalendarThree {public: map<int,int> heights;typedef map<int,int>::iterator IT;int max_c;MyCalendarThree() {heights[INT_MAX] =0;heights[INT_MIN] =0; max_c =0; }intbook(int start,int end) { IT l, r; // [l, r]: l.start <= start, r.start >= end l =prev(heights.upper_bound(start)); r =heights.lower_bound(end); // [cur, next]表示一个区间for (auto cur = l, nxt =next(cur); cur != r; cur = nxt,++nxt) { // 区间遍历结束if (nxt->first > end) heights[end] =cur->second; // 新区间if (cur->first <= start &&nxt->first > start) { max_c =max(max_c,heights[start] =cur->second +1); } else { max_c =max(max_c,++cur->second); } }return max_c; }};/** * Your MyCalendarThree object will be instantiated and called as such: * MyCalendarThree* obj = new MyCalendarThree(); * int param_1 = obj->book(start,end); */// @lc code=end