ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode731 我的日程表安排II

2022-07-19 10:04:10  阅读:142  来源: 互联网

标签:node Node 日程表 int rs II add ls leetcode731


思路:

动态开点线段树,这里维护了区间最大值和区间加一个值。

实现:

 1 class SegmentTree {
 2 public:
 3     int N = (int)1e9;
 4     class Node {
 5     public:
 6         // ls 和 rs 分别代表当前区间的左右子节点
 7         Node*ls=nullptr, *rs=nullptr;
 8         // val 代表当前区间的最大高度,add 为懒标记
 9         int val=0, add=0;
10         Node(){}
11     };
12     Node*root = nullptr;
13     SegmentTree(int n){
14         root=new Node();
15         N=n;
16     }
17     void update(int l,int r,int v){
18         _update(root,0,N,l,r,v);
19     }
20     void _update(Node*node, int lc, int rc, int l, int r, int v) {
21         if (l <= lc && rc <= r) {
22             node->add += v;
23             node->val += v;
24             return ;
25         }
26         pushdown(node);
27         int mid = lc + rc >> 1;
28         if (l <= mid) _update(node->ls, lc, mid, l, r, v);
29         if (r > mid) _update(node->rs, mid + 1, rc, l, r, v);
30         pushup(node);
31     }
32     int query(int l,int r){
33         return _query(root,0,N,l,r);
34     }
35     int _query(Node*node, int lc, int rc, int l, int r) {
36         if (l <= lc && rc <= r) return node->val;
37         pushdown(node);
38         int mid = lc + rc >> 1, ans = 0;
39         if (l <= mid) ans = _query(node->ls, lc, mid, l, r);
40         if (r > mid) ans = max(ans, _query(node->rs, mid + 1, rc, l, r));
41         return ans;
42     }
43     void pushdown(Node*node) {
44         if (node->ls == nullptr) node->ls = new Node();
45         if (node->rs == nullptr) node->rs = new Node();
46         if (node->add == 0) return ;
47         node->ls->add += node->add; node->rs->add += node->add;
48         node->ls->val += node->add; node->rs->val += node->add;
49         node->add = 0;
50     }
51     void pushup(Node*node) {
52         node->val = max(node->ls->val, node->rs->val);
53     }
54 
55 };
56 class MyCalendarTwo{
57 public:
58     SegmentTree*st=NULL;
59     MyCalendarTwo() {
60         st=new SegmentTree(1e9);
61     }
62 
63     bool book(int start, int end) {
64         int maxn=st->query(start,end-1);
65         if(maxn>=2){
66             return false;
67         }
68         st->update(start,end-1,1);
69         return true;
70 
71     }
72 };

标签:node,Node,日程表,int,rs,II,add,ls,leetcode731
来源: https://www.cnblogs.com/wangyiming/p/16492966.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有