c++线段树

Posted aaronwell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++线段树相关的知识,希望对你有一定的参考价值。

729. 我的日程安排表 I

实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内没有其他安排,则可以存储这个新的日程安排。

MyCalendar 有一个 book(int start, int end)方法。它意味着在 start 到 end 时间内增加一个日程安排,注意,这里的时间是半开区间,即 [start, end), 实数 x 的范围为,  start <= x < end

当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生重复预订。

每次调用 MyCalendar.book方法时,如果可以将日程安排成功添加到日历中而不会导致重复预订,返回 true。否则,返回 false 并且不要将该日程安排添加到日历中。

请按照以下步骤调用 MyCalendar 类: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end)

示例 1:

MyCalendar();
MyCalendar.book(10, 20); // returns true
MyCalendar.book(15, 25); // returns false
MyCalendar.book(20, 30); // returns true
解释: 
第一个日程安排可以添加到日历中.  第二个日程安排不能添加到日历中,因为时间 15 已经被第一个日程安排预定了。
第三个日程安排可以添加到日历中,因为第一个日程安排并不包含时间 20 。

说明:

  • 每个测试用例,调用 MyCalendar.book 函数最多不超过 1000次。
  • 调用函数 MyCalendar.book(start, end)时, start 和 end 的取值范围为 [0, 10^9]

解法1:

typedef struct tag_time_zone {
    int start;
    int end;
    tag_time_zone(int i1, int i2) {
        start = i1;
        end = i2;
    }
} time_zone;

class MyCalendar {
public:
    vector<time_zone> vec1;

    bool book(int start, int end) {
        for (vector<time_zone>::iterator it1 = vec1.begin(); it1 != vec1.end(); ++it1) {
            if (start >= it1->start && start < it1->end) {
                return false;
            } else if (end > it1->start && end <= it1->end) {
                return false;
            } else if (start <= it1->start && end > it1->end) {
                return false;
            }
        }

        vec1.push_back(time_zone(start,end));
        return true;
    }
};

/**
 * Your MyCalendar object will be instantiated and called as such:
 * MyCalendar* obj = new MyCalendar();
 * bool param_1 = obj->book(start,end);
 */

int main()
{
    MyCalendar myCalendar;
    vector<vector<int>> shuchu = {{97,100},{33,51},{89,100},{83,100},{75,92},{76,95},{19,30},{53,63},{8,23},{18,37},{87,100},{83,100},{54,67},{35,48},{58,75},{70,89},{13,32},{44,63},{51,62},{2,15}};
    for (int i = 0; i < shuchu.size(); ++i) {
        cout<<myCalendar.book(shuchu[i][0], shuchu[i][1]); // returns true
    }
    cout<<endl;

    for(auto c : myCalendar.vec1) {
        cout << c.start << " " << c.end <<endl;
    }

    return 0;
}

 

解法2:

class MyCalendar {
public:
    map<int, int> map1;

    bool book(int start, int end) {
        //for (map<int, int>::iterator it1 = map1.begin(); it1 != map1.end(); ++it1) {
        for (auto &c : map1) {
            if (start >= c.first && start < c.second) {
                return false;
            } else if (end > c.first && end <= c.second) {
                return false;
            } else if (start <= c.first && end > c.second) {
                return false;
            }
        }

        map1.insert(make_pair(start, end));
        return true;
    }
};

 

 

 

以上是关于c++线段树的主要内容,如果未能解决你的问题,请参考以下文章

线段树详解

C++ 树进阶系列之线段树和它的延迟更新

c++线段树

C++之路进阶——线段树(上帝造题的七分钟 2)

poj2823 线段树模板题 点修改(也可以用单调队列)

线段树