Submission #1348432

#TimeUsernameProblemLanguageResultExecution timeMemory
1348432k1r1t0Teleporter 2 (JOI26_teleporter)C++20
79 / 100
2824 ms16500 KiB
#include <bits/stdc++.h>

using namespace std;
#define int long long
using ll = long long;

const int N = 110000;
const int INF = (int)(1e18);

int n, m, L[N], R[N], C[N];
vector<array<int, 3>> inp;
array<int, 2> f[N];
vector<array<int, 2>> g;
array<int, 2> vv[4 * N];
int lz[4 * N];

void build(int v, int l, int r) {
    vv[v] = {-INF, -INF};
    lz[v] = 0;
    if (l == r) return;
    int mid = (l + r) / 2;
    build(v * 2 + 0, l, mid);
    build(v * 2 + 1, mid + 1, r);
}

void push(int v, int l, int r) {
    if (lz[v] == 0) return;
    vv[v][0] += lz[v];
    max(vv[v][0], -INF);
    if (l != r) {
        lz[v * 2 + 0] += lz[v];
        lz[v * 2 + 1] += lz[v];
    }
    lz[v] = 0;
}

array<int, 2> get(int v, int l, int r, int ql, int qr) {
    push(v, l, r);
    if (ql <= l && r <= qr) return vv[v];
    if (qr < l || r < ql) return {-INF, -INF};
    int mid = (l + r) / 2;
    return max(get(v * 2 + 0, l, mid, ql, qr), get(v * 2 + 1, mid + 1, r, ql, qr));
}

void upd(int v, int l, int r, int ql, int qr, int x) {
    push(v, l, r);
    if (ql <= l && r <= qr) {
        lz[v] += x;
        push(v, l, r);
        return;
    }
    if (qr < l || r < ql) return;
    int mid = (l + r) / 2;
    upd(v * 2 + 0, l, mid, ql, qr, x);
    upd(v * 2 + 1, mid + 1, r, ql, qr, x);
    vv[v] = max(vv[v * 2 + 0], vv[v * 2 + 1]);
}

void upd(int v, int l, int r, int k, array<int, 2> &x) {
    push(v, l, r);
    if (l == r) {
        vv[v] = x;
        return;
    }
    int mid = (l + r) / 2;
    if (k <= mid) upd(v * 2 + 0, l, mid, k, x);
    else upd(v * 2 + 1, mid + 1, r, k, x);
    vv[v] = max(vv[v * 2 + 0], vv[v * 2 + 1]);
}

array<int, 2> solve(int k) {
    f[0] = {0, 0};
    build(1, 0, m);
    upd(1, 0, m, 0, f[0]);
    int ptr = 0;
    for (int i = 1; i <= m; i++) {
        upd(1, 0, m, 0, i - 1, C[i]);
        while (ptr < (int) g.size() && g[ptr][0] < L[i]) {
            upd(1, 0, m, 0, g[ptr][1] - 1, -C[g[ptr][1]]);
            ptr++;
        }
        f[i] = get(1, 0, m, 0, i - 1);
        f[i][0] -= k;
        f[i][0] = max(f[i][0], -INF);
        f[i][1] += 1;
        upd(1, 0, m, i, f[i]);
    }
    return f[m];
}

int32_t main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int k; ll tn, tm, tk; cin >> tn >> tm >> tk;
    n = tn;
    m = tm;
    k = tk;
    for (int i = 1; i <= m; i++) {
        int l, r, c; ll tl, tr, tc; cin >> tl >> tr >> tc;
        l = tl;
        r = tr;
        c = tc;
        inp.push_back({l, r - 1, c});
    }
    sort(begin(inp), end(inp));
    for (int i = 1; i <= m; i++) {
        L[i] = inp[i - 1][0];
        R[i] = inp[i - 1][1];
        C[i] = inp[i - 1][2];
    }
    m++; k++;
    L[m] = R[m] = n;
    C[m] = 0;
    for (int i = 1; i <= m; i++)
        g.push_back({R[i], i});
    sort(begin(g), end(g));
    if (k > solve(1)[1]) {
        cout << 0;
        return 0;
    }
    int tl = 0, tr = (int)(1e15);
    while (tr - tl > 1) {
        int tm = (tl + tr) / 2;
        array<int, 2> res = solve(tm);
        if (res[1] > k) tl = tm;
        else tr = tm;
    }
    array<int, 2> res = solve(tr);
    cout << (ll) (accumulate(C + 1, C + 1 + n, (int) 0ll) - (res[0] - k + res[1] + tr * k));
}
#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...