Submission #847445

# Submission time Handle Problem Language Result Execution time Memory
847445 2023-09-09T16:26:05 Z I_love_Hoang_Yen Overtaking (IOI23_overtaking) C++17
100 / 100
2226 ms 157796 KB
#include "overtaking.h"
#include <bits/stdc++.h>
//#include "debug.h"
using namespace std;
using ll = long long;

constexpr int MAX_SS = 1011;

// Lazy Segment Tree, copied from AtCoder {{{
// Source: https://github.com/atcoder/ac-library/blob/master/atcoder/lazysegtree.hpp
// Doc: https://atcoder.github.io/ac-library/master/document_en/lazysegtree.html
//
// Notes:
// - Index of elements from 0
// - Range queries are [l, r-1]
// - composition(f, g) should return f(g())
//
// Tested:
// - https://oj.vnoi.info/problem/qmax2
// - https://oj.vnoi.info/problem/lites
// - (range set, add, mult, sum) https://oj.vnoi.info/problem/segtree_itmix
// - (range add (i-L)*A + B, sum) https://oj.vnoi.info/problem/segtree_itladder
// - https://atcoder.jp/contests/practice2/tasks/practice2_l
// - https://judge.yosupo.jp/problem/range_affine_range_sum

int ceil_pow2(int n) {
    int x = 0;
    while ((1U << x) < (unsigned int)(n)) x++;
    return x;
}
template<
    class S,                 // node data type
    S (*op) (S, S),          // combine 2 nodes
    S (*e) (),               // identity element
    class F,                 // lazy propagation tag
    S (*mapping) (F, S),     // apply tag F on a node
    F (*composition) (F, F), // combine 2 tags
    F (*id)()                // identity tag
>
struct LazySegTree {
    LazySegTree() : LazySegTree(0) {}
    explicit LazySegTree(int n) : LazySegTree(vector<S>(n, e())) {}
    explicit LazySegTree(const vector<S>& v) : _n((int) v.size()) {
        log = ceil_pow2(_n);
        size = 1 << log;
        d = std::vector<S>(2 * size, e());
        lz = std::vector<F>(size, id());
        for (int i = 0; i < _n; i++) d[size + i] = v[i];
        for (int i = size - 1; i >= 1; i--) {
            update(i);
        }
    }

    // 0 <= p < n
    void set(int p, S x) {
        assert(0 <= p && p < _n);
        p += size;
        for (int i = log; i >= 1; i--) push(p >> i);
        d[p] = x;
        for (int i = 1; i <= log; i++) update(p >> i);
    }

    // 0 <= p < n
    S get(int p) {
        assert(0 <= p && p < _n);
        p += size;
        for (int i = log; i >= 1; i--) push(p >> i);
        return d[p];
    }

    // Get product in range [l, r-1]
    // 0 <= l <= r <= n
    // For empty segment (l == r) -> return e()
    S prod(int l, int r) {
        assert(0 <= l && l <= r && r <= _n);
        if (l == r) return e();

        l += size;
        r += size;

        for (int i = log; i >= 1; i--) {
            if (((l >> i) << i) != l) push(l >> i);
            if (((r >> i) << i) != r) push((r - 1) >> i);
        }

        S sml = e(), smr = e();
        while (l < r) {
            if (l & 1) sml = op(sml, d[l++]);
            if (r & 1) smr = op(d[--r], smr);
            l >>= 1;
            r >>= 1;
        }

        return op(sml, smr);
    }

    S all_prod() {
        return d[1];
    }

    // 0 <= p < n
    void apply(int p, F f) {
        assert(0 <= p && p < _n);
        p += size;
        for (int i = log; i >= 1; i--) push(p >> i);
        d[p] = mapping(f, d[p]);
        for (int i = 1; i <= log; i++) update(p >> i);
    }

    // Apply f on all elements in range [l, r-1]
    // 0 <= l <= r <= n
    void apply(int l, int r, F f) {
        assert(0 <= l && l <= r && r <= _n);
        if (l == r) return;

        l += size;
        r += size;

        for (int i = log; i >= 1; i--) {
            if (((l >> i) << i) != l) push(l >> i);
            if (((r >> i) << i) != r) push((r - 1) >> i);
        }

        {
            int l2 = l, r2 = r;
            while (l < r) {
                if (l & 1) all_apply(l++, f);
                if (r & 1) all_apply(--r, f);
                l >>= 1;
                r >>= 1;
            }
            l = l2;
            r = r2;
        }

        for (int i = 1; i <= log; i++) {
            if (((l >> i) << i) != l) update(l >> i);
            if (((r >> i) << i) != r) update((r - 1) >> i);
        }
    }

    // Binary search on SegTree to find largest r:
    //    f(op(a[l] .. a[r-1])) = true   (assuming empty array is always true)
    //    f(op(a[l] .. a[r])) = false    (assuming op(..., a[n]), which is out of bound, is always false)
    template <bool (*g)(S)> int max_right(int l) {
        return max_right(l, [](S x) { return g(x); });
    }
    template <class G> int max_right(int l, G g) {
        assert(0 <= l && l <= _n);
        assert(g(e()));
        if (l == _n) return _n;
        l += size;
        for (int i = log; i >= 1; i--) push(l >> i);
        S sm = e();
        do {
            while (l % 2 == 0) l >>= 1;
            if (!g(op(sm, d[l]))) {
                while (l < size) {
                    push(l);
                    l = (2 * l);
                    if (g(op(sm, d[l]))) {
                        sm = op(sm, d[l]);
                        l++;
                    }
                }
                return l - size;
            }
            sm = op(sm, d[l]);
            l++;
        } while ((l & -l) != l);
        return _n;
    }

    // Binary search on SegTree to find smallest l:
    //    f(op(a[l] .. a[r-1])) = true      (assuming empty array is always true)
    //    f(op(a[l-1] .. a[r-1])) = false   (assuming op(a[-1], ..), which is out of bound, is always false)
    template <bool (*g)(S)> int min_left(int r) {
        return min_left(r, [](S x) { return g(x); });
    }
    template <class G> int min_left(int r, G g) {
        assert(0 <= r && r <= _n);
        assert(g(e()));
        if (r == 0) return 0;
        r += size;
        for (int i = log; i >= 1; i--) push((r - 1) >> i);
        S sm = e();
        do {
            r--;
            while (r > 1 && (r % 2)) r >>= 1;
            if (!g(op(d[r], sm))) {
                while (r < size) {
                    push(r);
                    r = (2 * r + 1);
                    if (g(op(d[r], sm))) {
                        sm = op(d[r], sm);
                        r--;
                    }
                }
                return r + 1 - size;
            }
            sm = op(d[r], sm);
        } while ((r & -r) != r);
        return 0;
    }


private:
    int _n, size, log;
    vector<S> d;
    vector<F> lz;

    void update(int k) {
        d[k] = op(d[2*k], d[2*k+1]);
    }
    void all_apply(int k, F f) {
        d[k] = mapping(f, d[k]);
        if (k < size) lz[k] = composition(f, lz[k]);
    }
    void push(int k) {
        all_apply(2*k, lz[k]);
        all_apply(2*k+1, lz[k]);
        lz[k] = id();
    }
};
// }}}

ll op(ll x, ll y) { return max(x, y); }
ll e() { return 0ll; }
ll mapping(ll f, ll s) { return max(s, f); }
ll composition(ll f, ll g) { return max(f, g); }
ll id() { return 0ll; }

// lines[i]: stores lines between i-th and (i+1)-th sorting stations
//           each line is represented by its 2 endpoints
set<pair<ll, ll>> lines[MAX_SS];
int M;
ll X;
vector<int> S;

vector<ll> xs;

using STMax = LazySegTree<ll, op, e, ll, mapping, composition, id>;
STMax st;

void init(
        int L,
        int nBus, vector<ll> T, vector<int> W,
        int _X,
        int _M, vector<int> _S) {
    // subtask 4 {{{
    M = _M;
    X = _X;
    S = _S;

    // sort buses in decreasing order of W (so slowest buses are processed first)
    vector<pair<ll, ll>> buses;
    for (int i = 0; i < nBus; ++i) {
        if (W[i] <= X) continue;
        buses.emplace_back(W[i], T[i]);
    }
    std::sort(buses.begin(), buses.end());
    std::reverse(buses.begin(), buses.end());

    // init gaps between 2 sorting stations
    for (int i = 0; i < M-1; ++i) {  // only M-1 gaps
        lines[i].clear();
        lines[i].insert({0, 0});
    }

    // for each bus, add its line to all gaps
    for (const auto& [w, t] : buses) {
        ll cur_time = t;
        for (int j = 0; j < M-1; ++j) {
            auto it = std::prev(lines[j].lower_bound({cur_time, 0}));
            ll exit_time = std::max(it->second, cur_time + w*(S[j+1] - S[j]));
            lines[j].insert({cur_time, exit_time});

            cur_time = exit_time;
        }
    }
    // }}}

    for (int i = M-2; i >= 0; --i) {
        for (auto [l, r] : lines[i]) {
            if (!l && !r) continue;
            xs.push_back(l - X*S[i] + 1);
            xs.push_back(r - X*S[i+1]);
        }
    }
    std::sort(xs.begin(), xs.end());
    xs.erase(unique(xs.begin(), xs.end()), xs.end());

    st = STMax(xs);
    for (int i = M-2; i >= 0; --i) {
        for (auto [l, r] : lines[i]) {
            if (!l && !r) continue;
            int u = lower_bound(xs.begin(), xs.end(), l - X*S[i] + 1) - xs.begin();
            int v = lower_bound(xs.begin(), xs.end(), r - X*S[i+1]) - xs.begin();

            st.apply(u, v+1, st.get(v));
        }
    }
}

ll arrival_time(ll Y) {
    ll tx = X * (ll) S.back();
    if (xs.empty() || Y < xs[0] || Y > xs.back()) return tx + Y;
    return tx + max(Y, st.get(upper_bound(xs.begin(), xs.end(), Y) - xs.begin() - 1));
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 1 ms 600 KB Output is correct
7 Correct 1 ms 604 KB Output is correct
8 Correct 1 ms 856 KB Output is correct
9 Correct 1 ms 600 KB Output is correct
10 Correct 1 ms 600 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 344 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 2 ms 604 KB Output is correct
7 Correct 2 ms 604 KB Output is correct
8 Correct 1 ms 604 KB Output is correct
9 Correct 2 ms 600 KB Output is correct
10 Correct 1 ms 600 KB Output is correct
11 Correct 1 ms 604 KB Output is correct
12 Correct 1 ms 600 KB Output is correct
13 Correct 1 ms 344 KB Output is correct
14 Correct 1 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 344 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 0 ms 344 KB Output is correct
6 Correct 1 ms 344 KB Output is correct
7 Correct 1 ms 344 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 7 ms 2008 KB Output is correct
10 Correct 7 ms 2008 KB Output is correct
11 Correct 7 ms 2008 KB Output is correct
12 Correct 7 ms 2008 KB Output is correct
13 Correct 7 ms 2008 KB Output is correct
14 Correct 7 ms 2008 KB Output is correct
15 Correct 7 ms 2008 KB Output is correct
16 Correct 7 ms 2008 KB Output is correct
17 Correct 7 ms 2008 KB Output is correct
18 Correct 7 ms 2012 KB Output is correct
19 Correct 7 ms 2008 KB Output is correct
20 Correct 7 ms 2008 KB Output is correct
21 Correct 4 ms 1112 KB Output is correct
22 Correct 4 ms 1112 KB Output is correct
23 Correct 4 ms 1112 KB Output is correct
24 Correct 6 ms 1624 KB Output is correct
25 Correct 6 ms 1624 KB Output is correct
26 Correct 6 ms 1628 KB Output is correct
27 Correct 6 ms 1624 KB Output is correct
28 Correct 4 ms 1624 KB Output is correct
29 Correct 5 ms 1368 KB Output is correct
30 Correct 4 ms 1372 KB Output is correct
31 Correct 5 ms 1368 KB Output is correct
32 Correct 7 ms 1756 KB Output is correct
33 Correct 7 ms 2008 KB Output is correct
34 Correct 7 ms 2008 KB Output is correct
35 Correct 7 ms 2188 KB Output is correct
36 Correct 7 ms 2008 KB Output is correct
37 Correct 7 ms 2008 KB Output is correct
38 Correct 0 ms 344 KB Output is correct
39 Correct 1 ms 344 KB Output is correct
40 Correct 6 ms 1368 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 344 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 0 ms 344 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 600 KB Output is correct
8 Correct 1 ms 604 KB Output is correct
9 Correct 1 ms 856 KB Output is correct
10 Correct 1 ms 600 KB Output is correct
11 Correct 1 ms 600 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 1 ms 344 KB Output is correct
14 Correct 1 ms 344 KB Output is correct
15 Correct 1 ms 344 KB Output is correct
16 Correct 7 ms 2008 KB Output is correct
17 Correct 7 ms 2008 KB Output is correct
18 Correct 7 ms 2008 KB Output is correct
19 Correct 7 ms 2008 KB Output is correct
20 Correct 7 ms 2008 KB Output is correct
21 Correct 7 ms 2008 KB Output is correct
22 Correct 7 ms 2008 KB Output is correct
23 Correct 7 ms 2008 KB Output is correct
24 Correct 7 ms 2008 KB Output is correct
25 Correct 7 ms 2012 KB Output is correct
26 Correct 7 ms 2008 KB Output is correct
27 Correct 7 ms 2008 KB Output is correct
28 Correct 4 ms 1112 KB Output is correct
29 Correct 4 ms 1112 KB Output is correct
30 Correct 4 ms 1112 KB Output is correct
31 Correct 6 ms 1624 KB Output is correct
32 Correct 6 ms 1624 KB Output is correct
33 Correct 6 ms 1628 KB Output is correct
34 Correct 6 ms 1624 KB Output is correct
35 Correct 4 ms 1624 KB Output is correct
36 Correct 5 ms 1368 KB Output is correct
37 Correct 4 ms 1372 KB Output is correct
38 Correct 5 ms 1368 KB Output is correct
39 Correct 7 ms 1756 KB Output is correct
40 Correct 7 ms 2008 KB Output is correct
41 Correct 7 ms 2008 KB Output is correct
42 Correct 7 ms 2188 KB Output is correct
43 Correct 7 ms 2008 KB Output is correct
44 Correct 7 ms 2008 KB Output is correct
45 Correct 0 ms 344 KB Output is correct
46 Correct 1 ms 344 KB Output is correct
47 Correct 6 ms 1368 KB Output is correct
48 Correct 1553 ms 126556 KB Output is correct
49 Correct 1333 ms 126664 KB Output is correct
50 Correct 1416 ms 128340 KB Output is correct
51 Correct 1397 ms 127140 KB Output is correct
52 Correct 1408 ms 126088 KB Output is correct
53 Correct 1329 ms 126316 KB Output is correct
54 Correct 1426 ms 126124 KB Output is correct
55 Correct 886 ms 104872 KB Output is correct
56 Correct 1191 ms 126112 KB Output is correct
57 Correct 1099 ms 122636 KB Output is correct
58 Correct 1230 ms 127512 KB Output is correct
59 Correct 1234 ms 125792 KB Output is correct
60 Correct 1260 ms 125944 KB Output is correct
61 Correct 1286 ms 126700 KB Output is correct
62 Correct 2 ms 856 KB Output is correct
63 Correct 3 ms 600 KB Output is correct
64 Correct 601 ms 64656 KB Output is correct
65 Correct 647 ms 64428 KB Output is correct
66 Correct 859 ms 80556 KB Output is correct
67 Correct 1614 ms 128428 KB Output is correct
68 Correct 1661 ms 128356 KB Output is correct
69 Correct 1162 ms 103452 KB Output is correct
70 Correct 1304 ms 128932 KB Output is correct
71 Correct 1297 ms 128596 KB Output is correct
72 Correct 1308 ms 128420 KB Output is correct
73 Correct 1291 ms 128420 KB Output is correct
74 Correct 1305 ms 128268 KB Output is correct
75 Correct 2 ms 600 KB Output is correct
76 Correct 1 ms 604 KB Output is correct
77 Correct 1 ms 600 KB Output is correct
78 Correct 1154 ms 91052 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 344 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 0 ms 344 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 600 KB Output is correct
8 Correct 1 ms 604 KB Output is correct
9 Correct 1 ms 856 KB Output is correct
10 Correct 1 ms 600 KB Output is correct
11 Correct 1 ms 600 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 1 ms 344 KB Output is correct
14 Correct 1 ms 344 KB Output is correct
15 Correct 1 ms 344 KB Output is correct
16 Correct 1 ms 344 KB Output is correct
17 Correct 1 ms 344 KB Output is correct
18 Correct 2 ms 604 KB Output is correct
19 Correct 2 ms 604 KB Output is correct
20 Correct 1 ms 604 KB Output is correct
21 Correct 2 ms 600 KB Output is correct
22 Correct 1 ms 600 KB Output is correct
23 Correct 1 ms 604 KB Output is correct
24 Correct 1 ms 600 KB Output is correct
25 Correct 1 ms 344 KB Output is correct
26 Correct 1 ms 348 KB Output is correct
27 Correct 7 ms 2008 KB Output is correct
28 Correct 7 ms 2008 KB Output is correct
29 Correct 7 ms 2008 KB Output is correct
30 Correct 7 ms 2008 KB Output is correct
31 Correct 7 ms 2008 KB Output is correct
32 Correct 7 ms 2008 KB Output is correct
33 Correct 7 ms 2008 KB Output is correct
34 Correct 7 ms 2008 KB Output is correct
35 Correct 7 ms 2008 KB Output is correct
36 Correct 7 ms 2012 KB Output is correct
37 Correct 7 ms 2008 KB Output is correct
38 Correct 7 ms 2008 KB Output is correct
39 Correct 4 ms 1112 KB Output is correct
40 Correct 4 ms 1112 KB Output is correct
41 Correct 4 ms 1112 KB Output is correct
42 Correct 6 ms 1624 KB Output is correct
43 Correct 6 ms 1624 KB Output is correct
44 Correct 6 ms 1628 KB Output is correct
45 Correct 6 ms 1624 KB Output is correct
46 Correct 4 ms 1624 KB Output is correct
47 Correct 5 ms 1368 KB Output is correct
48 Correct 4 ms 1372 KB Output is correct
49 Correct 5 ms 1368 KB Output is correct
50 Correct 7 ms 1756 KB Output is correct
51 Correct 7 ms 2008 KB Output is correct
52 Correct 7 ms 2008 KB Output is correct
53 Correct 7 ms 2188 KB Output is correct
54 Correct 7 ms 2008 KB Output is correct
55 Correct 7 ms 2008 KB Output is correct
56 Correct 0 ms 344 KB Output is correct
57 Correct 1 ms 344 KB Output is correct
58 Correct 6 ms 1368 KB Output is correct
59 Correct 1553 ms 126556 KB Output is correct
60 Correct 1333 ms 126664 KB Output is correct
61 Correct 1416 ms 128340 KB Output is correct
62 Correct 1397 ms 127140 KB Output is correct
63 Correct 1408 ms 126088 KB Output is correct
64 Correct 1329 ms 126316 KB Output is correct
65 Correct 1426 ms 126124 KB Output is correct
66 Correct 886 ms 104872 KB Output is correct
67 Correct 1191 ms 126112 KB Output is correct
68 Correct 1099 ms 122636 KB Output is correct
69 Correct 1230 ms 127512 KB Output is correct
70 Correct 1234 ms 125792 KB Output is correct
71 Correct 1260 ms 125944 KB Output is correct
72 Correct 1286 ms 126700 KB Output is correct
73 Correct 2 ms 856 KB Output is correct
74 Correct 3 ms 600 KB Output is correct
75 Correct 601 ms 64656 KB Output is correct
76 Correct 647 ms 64428 KB Output is correct
77 Correct 859 ms 80556 KB Output is correct
78 Correct 1614 ms 128428 KB Output is correct
79 Correct 1661 ms 128356 KB Output is correct
80 Correct 1162 ms 103452 KB Output is correct
81 Correct 1304 ms 128932 KB Output is correct
82 Correct 1297 ms 128596 KB Output is correct
83 Correct 1308 ms 128420 KB Output is correct
84 Correct 1291 ms 128420 KB Output is correct
85 Correct 1305 ms 128268 KB Output is correct
86 Correct 2 ms 600 KB Output is correct
87 Correct 1 ms 604 KB Output is correct
88 Correct 1 ms 600 KB Output is correct
89 Correct 1154 ms 91052 KB Output is correct
90 Correct 1491 ms 127592 KB Output is correct
91 Correct 1754 ms 151380 KB Output is correct
92 Correct 1743 ms 152200 KB Output is correct
93 Correct 1817 ms 151436 KB Output is correct
94 Correct 1826 ms 152212 KB Output is correct
95 Correct 1740 ms 151260 KB Output is correct
96 Correct 1791 ms 151768 KB Output is correct
97 Correct 1008 ms 106924 KB Output is correct
98 Correct 1626 ms 151520 KB Output is correct
99 Correct 1564 ms 148396 KB Output is correct
100 Correct 1687 ms 151064 KB Output is correct
101 Correct 1691 ms 150488 KB Output is correct
102 Correct 1702 ms 151720 KB Output is correct
103 Correct 1658 ms 151152 KB Output is correct
104 Correct 1008 ms 88288 KB Output is correct
105 Correct 1140 ms 90960 KB Output is correct
106 Correct 1229 ms 109772 KB Output is correct
107 Correct 1981 ms 157616 KB Output is correct
108 Correct 2178 ms 157612 KB Output is correct
109 Correct 2197 ms 157796 KB Output is correct
110 Correct 2226 ms 157760 KB Output is correct
111 Correct 1609 ms 128940 KB Output is correct
112 Correct 1773 ms 153728 KB Output is correct
113 Correct 1876 ms 154776 KB Output is correct
114 Correct 2066 ms 155952 KB Output is correct
115 Correct 1848 ms 155336 KB Output is correct
116 Correct 1759 ms 155312 KB Output is correct
117 Correct 177 ms 28496 KB Output is correct
118 Correct 172 ms 28240 KB Output is correct
119 Correct 168 ms 27216 KB Output is correct
120 Correct 171 ms 28240 KB Output is correct
121 Correct 172 ms 29132 KB Output is correct
122 Correct 1503 ms 113804 KB Output is correct
123 Correct 2088 ms 156092 KB Output is correct
124 Correct 2096 ms 156080 KB Output is correct
125 Correct 2142 ms 155968 KB Output is correct