Submission #1136590

#TimeUsernameProblemLanguageResultExecution timeMemory
1136590alterioShortcut (IOI16_shortcut)C++20
0 / 100
28 ms63048 KiB
#include "shortcut.h"
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define all(x) (x).begin(), (x).end()

const int mxn = 1e6 + 100;

vector<int> l, d;
ll n, c, prf[mxn], prfR[mxn], suf[mxn];

ll get(int l, int r, bool side) {
    l = max(l, 0);
    r--;
    if (l > r) return 0;
    if (side) return prf[r] - (l == 0 ? 0 : prf[l - 1]);
    return prfR[r] - (l == 0 ? 0 : prfR[l - 1]);
}

ll minCost(int x, int y, bool side) {
    ll res = 0, mx[n];
    memset(mx, 0, sizeof(mx));
    mx[0] = d[0];
    for (int i = 1; i <= x; i++) {
        ll dist = mx[i - 1] + l[i - 1];
        mx[i] = max(dist, (ll) d[i]);
        res = max(res, dist + d[i]);
    }
    int split = x;
    for (int i = x; i <= y; i++) {
        ll goF = get(x, i, side);
        ll goA = c + get(i, y - 1, side);
        if (goF <= goA) split = i;
        else break;
    }
    for (int i = x + 1; i <= split; i++) {
        ll dist = mx[i - 1] + l[i - 1];
        mx[i] = max(dist, (ll) d[i]);
        res = max(res, dist + d[i]);
    }
    mx[y] = mx[x] + c;
    res = max(res, mx[y] + d[y]);
    for (int i = y - 1; i > split; i--) {
        ll dist = mx[i + 1] + l[i];
        mx[i] = max(dist, (ll) d[i]);
        res = max(res, dist + d[i]);
    }
    for (int i = y + 1; i < n; i++) {
        ll dist = mx[i - 1] + l[i - 1];
        mx[i] = max(dist, (ll) d[i]);
        res = max(res, dist + d[i]);
    }
    return res;
}

struct SGT {
    vector<ll> sgt;

    SGT(int sz) {
        sgt.resize(4 * sz);
    }

    void update(int k, int l, int r, int i, ll val) {
        if (l > i || r < i) return;
        if (l == r) {
            sgt[k] = val;
            return;
        }
        int mid = (l + r) / 2;
        update(k * 2, l, mid, i, val);
        update(k * 2 + 1, mid + 1, r, i, val);
        sgt[k] = max(sgt[k * 2], sgt[k * 2 + 1]);
    }

    ll get(int k, int l, int r, int i, int j) {
        if (l > j || r < i) return 0;
        if (i <= l && r <= j) return sgt[k];
        int mid = (l + r) / 2;
        return max(get(k * 2, l, mid, i, j), get(k * 2 + 1, mid + 1, r, i, j));
    }
} sgt(mxn), sgtR(mxn);

ll only(int x, int y) {
    int r = x;
    ll ans = 0;
    for (int i = x; i < y; i++) {
        while (r < y && get(i, r + 1, 1) <= get(x, i, 1) + c + get(r + 1, y - 1, 1)) r++;
        ans = max({ans, d[i] + sgt.get(1, 0, n - 1, i + 1, r) - (i == 0 ? 0 : prf[i - 1]) - (r < l.size() ? l[r] : 0), d[i] + get(x, i, 1) + c + sgtR.get(1, 0, n - 1, r + 1, y) - suf[y]});
        // cout << x << " " << y << " : " << i << " " << r << " " << d[i] + sgt.get(1, 0, n - 1, i + 1, r) - (i == 0 ? 0 : prf[i - 1]) - (r < l.size() ? l[r] : 0) << endl;
    }
    return ans;
}

ll find_shortcut(int _n, vector<int> _l, vector<int> _d, int _c) {
    n = _n, l = _l, d = _d, c = _c;
    prf[0] = l[0];
    for (int i = 1; i < n - 1; i++) prf[i] = prf[i - 1] + l[i];
    for (int i = 0; i < n; i++) sgt.update(1, 0, n - 1, i, prf[i] + d[i]);
    reverse(all(l));
    prfR[0] = l[0];
    for (int i = 1; i < n - 1; i++) prfR[i] = prfR[i - 1] + l[i];
    reverse(all(l));
    sgtR.update(1, 0, n - 1, n - 1, d[n - 1]);
    for (int i = n - 2; i >= 0; i--) {
        suf[i] = suf[i + 1] + l[i];
        sgtR.update(1, 0, n - 1, i, suf[i] + d[i]);
    }
    c = 0;
    ll minAns = minCost(0, 0, 1);
    c = _c;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            ll dist = get(i, j, 1);
            if (c < dist) {
                ll mx = max(minCost(i, j, 1), only(i, j));
                reverse(all(l));
                reverse(all(d));
                mx = max(mx, minCost(n - j - 1, n - i - 1, 0));
                minAns = min(minAns, mx);
                reverse(all(l));
                reverse(all(d));
            }
        }
    }
    return minAns;
}

Compilation message (stderr)

shortcut.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
shortcut_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...