123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- #include <iostream>
- #include <vector>
- using std::vector;
- using std::cout; using std::endl;
- class MyCalendarThree {
- public:
- MyCalendarThree() {
- root = build();
- }
- int book(int start, int end) {
- // end is not included, so -1
- update(root, 1, 0, N, start, end - 1);
- return query(root, 0, N, 0, N);
- }
- void print() {
- for (int i = 0; i < st.size(); i++) {
- SegNode node = st[i];
- cout << "pos: " << i << ", k: " << node.k << ", lazy: " << node.lazy << ", lc: " << node.lc << ", rc: " << node.rc << endl;
- }
- }
- private:
- struct SegNode {
- int lazy;
- int k;
- int lc;
- int rc;
- };
- vector<SegNode> st;
- // 10 ^ 9
- static constexpr int N = 1000000000;
- int root;
- int build() {
- int pos = st.size();
- st.push_back(SegNode{});
- return pos;
- }
- void push_down(int pos) {
- if (st[pos].lc == 0) st[pos].lc = build();
- if (st[pos].rc == 0) st[pos].rc = build();
- st[st[pos].lc].lazy += st[pos].lazy;
- st[st[pos].rc].lazy += st[pos].lazy;
- }
- void push_up(int pos) {
- if (st[pos].lc != 0)
- st[pos].k = std::max(st[pos].k, st[st[pos].lc].k);
- if (st[pos].rc != 0)
- st[pos].k = std::max(st[pos].k, st[st[pos].rc].k);
- }
- void update(int pos, int val, int l, int r, int ql, int qr) {
- if (ql <= l && r <= qr) {
- st[pos].k += val;
- st[pos].lazy += val;
- return;
- }
- if (st[pos].lazy != 0) {
- push_down(pos);
- st[st[pos].lc].k += st[pos].lazy;
- st[st[pos].rc].k += st[pos].lazy;
- st[pos].lazy = 0;
- }
- int mid = l + (r - l) / 2;
- if (ql <= mid) {
- if (st[pos].lc == 0) st[pos].lc = build();
- update(st[pos].lc, val, l, mid, ql, qr);
- }
- if (mid < qr) {
- if (st[pos].rc == 0) st[pos].rc = build();
- update(st[pos].rc, val, mid + 1, r, ql, qr);
- }
- push_up(pos);
- }
- int query(int pos, int l, int r, int ql, int qr) {
- if (ql <= l && r <= qr) return st[pos].k;
- if (st[pos].lazy != 0) {
- push_down(pos);
- st[st[pos].lc].k += st[pos].lazy;
- st[st[pos].rc].k += st[pos].lazy;
- st[pos].lazy = 0;
- }
- int mid = l + (r - l) / 2;
- int ans = 0;
- if (ql <= mid) {
- if (st[pos].lc == 0) st[pos].lc = build();
- ans = std::max(ans, query(st[pos].lc, l, mid, ql, qr));
- }
- if (mid < qr) {
- if (st[pos].rc == 0) st[pos].rc = build();
- ans = std::max(ans, query(st[pos].rc, mid + 1, r, ql, qr));
- }
- return ans;
- }
- };
- // [26,35],[26,32],[25,32],[18,26],[40,45],[19,26],[48,50],[1,6],[46,50],[11,18]
- // 1 2 3 3 3 3 3 3 3 3
- // 1 5 11 17 18 19 25 26 31 34 40 44 46 48 49
- // ----------
- // ------
- // ----------
- // ----------
- // ------
- // ------
- // ------
- // -----
- // ----------
- // ----------
- int main() {
- MyCalendarThree* sol = new MyCalendarThree();
- cout << "actual: " << sol->book(26,35) << ", expected: " << 1 << endl;
- cout << "actual: " << sol->book(26,32) << ", expected: " << 2 << endl;
- cout << "actual: " << sol->book(25,32) << ", expected: " << 3 << endl;
- cout << "actual: " << sol->book(18,26) << ", expected: " << 3 << endl;
- cout << "actual: " << sol->book(40,45) << ", expected: " << 3 << endl;
- cout << "actual: " << sol->book(19,26) << ", expected: " << 3 << endl;
- cout << "actual: " << sol->book(48,50) << ", expected: " << 3 << endl;
- cout << "actual: " << sol->book(1,6) << ", expected: " << 3 << endl;
- cout << "actual: " << sol->book(46,50) << ", expected: " << 3 << endl;
- cout << "actual: " << sol->book(11,18) << ", expected: " << 3 << endl;
- return 0;
- }
|