• 732. My Calendar III (prev)


    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.

    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].

    Approach #1: C++.

    class MyCalendarThree {
    public:
        MyCalendarThree() {
            
        }
        
        int book(int start, int end) {
            ++books[start];
            --books[end];
            int count = 0;
            int ant = 0;
            for (auto it : books) {
                count += it.second;
                ant = max(ant, count);
                if (it.first > end) break;
            }
            maxNum = max(maxNum, ant);
            return maxNum;
        }
        
    private:
        map<int, int> books;
        int maxNum = 0;
    };
    

      

    Approach #2: C++.

    class MyCalendarThree {
    public:
        MyCalendarThree() {
            books[INT_MAX] = 0;
            books[INT_MIN] = 0;
            maxCount = 0;
        }
        
        int book(int start, int end) {
            auto l = prev(books.upper_bound(start));
            auto r = books.lower_bound(end);
            
            for (auto curr = l, next = curr; curr != r; curr = next) {
                ++next;
                if (next->first > end) 
                    books[end] = curr->second;
                if (curr->first <= start && next->first > start) {
                    maxCount = max(maxCount, books[start] = curr->second+1);
                }
                else {
                    maxCount = max(maxCount, ++curr->second);
                }
            }
            return maxCount;
        }
        
    private:
        map<int, int> books;
        int maxCount;
    };
    

      

    Note:

    std::prev in C++.

    Approach #3: C++. [segment tree]

    ...........

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    HDU 2602
    ZOJ 1074 最大子矩阵和
    POJ 3903
    最大子段和
    HDU 1052
    CodeForces 18C
    CodeForces 546B-Soldier and Badges
    UVA 11462-Age sort
    Codeforces Round #326 (Div. 2)-Duff in Love
    Codeforces Round #327 (Div. 2)-Wizards' Duel
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10060301.html
Copyright © 2020-2023  润新知