1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| class Node { friend class MyCalendar; Node *left, *right; int val, add; };
class MyCalendar { public: MyCalendar():N(1e9), root(new Node()){ } bool book(int start, int end) { if (query(root, 0, N, start, end - 1) != 0) return false; update(root, 0, N, start, end - 1, 1); return true; } void update(Node* node, int start, int end, int l, int r, int val) { if (l <= start && end <= r) { node -> val += val; node -> add += val; return ; } pushDown(node); int mid = (start + end) >> 1; if (l <= mid) update(node -> left, start, mid, l, r, val); if (r > mid) update(node -> right, mid + 1, end, l, r, val); pushUp(node); } int query(Node* node, int start, int end, int l, int r) { if (l <= start && end <= r) return node -> val; pushDown(node); int mid = (start + end) >> 1, ans = 0; if (l <= mid) ans = query(node -> left, start, mid, l, r); if (r > mid) ans = max(ans, query(node -> right, mid + 1, end, l, r)); return ans; } private: int N; Node* root; void pushUp(Node* node) { node -> val = max(node -> left -> val, node -> right -> val); } void pushDown(Node* node) { if (node -> left == nullptr) node -> left = new Node(); if (node -> right == nullptr) node -> right = new Node(); if (node -> add == 0) return ; node -> left -> val += node -> add; node -> right -> val += node -> add; node -> left -> add += node -> add; node -> right ->add += node -> add; node -> add = 0; } };
|