Submission #1309876

#TimeUsernameProblemLanguageResultExecution timeMemory
1309876khoadFuel Station (NOI20_fuelstation)C++20
100 / 100
243 ms26264 KiB
#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define inf32 ((int)1e9 + 7)
#define inf64 ((long long)1e18 + 7)
#define MASK32(x) (1 << (x))
#define MASK64(x) (1ll << (x))
#define BIT(mask, i) (((mask) >> (i)) & 1)
#define all(a) begin(a), end(a)
#define isz(a) ((int)a.size())

const int N = 3e5 + 5;

long long seg[N << 2], lazy[N << 2];

void down(int id, int l, int r) {
    seg[id << 1] += lazy[id];
    seg[id << 1 | 1] += lazy[id];
    lazy[id << 1] += lazy[id];
    lazy[id << 1 | 1] += lazy[id];
    lazy[id] = 0;
}

void upd(int id, int l, int r, long long v, int tl, int tr) {
    if(l <= tl && tr <= r) {
        seg[id] += v;
        lazy[id] += v;
        return;
    }
    down(id, l, r);
    int mid = (tl + tr) >> 1;
    if(l <= mid) upd(id << 1, l, r, v, tl, mid);
    if(r > mid) upd(id << 1 | 1, l, r, v, mid + 1, tr);
    seg[id] = max(seg[id << 1], seg[id << 1 | 1]);
}

long long get(int id, int l, int r, int tl, int tr) {
    if(l <= tl && tr <= r) return seg[id];
    down(id, l, r);
    int mid = (tl + tr) >> 1;
    if(r <= mid) return get(id << 1, l, r, tl, mid);
    if(l > mid) return get(id << 1 | 1, l, r, mid + 1, tr);
    return max(get(id << 1, l, r, tl, mid), get(id << 1 | 1, l, r, mid + 1, tr));
}

struct Station {
    long long x, a, b;
    int i;

    bool operator<(const Station& rhs) const {
        return x < rhs.x;
    }

    bool operator>(const Station& rhs) const {
        return b > rhs.b;
    }
} s[N];

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n, d;
    cin >> n >> d;
    for(int i = 1; i <= n; ++i) cin >> s[i].x >> s[i].a >> s[i].b;
    sort(s + 1, s + n + 1);
    for(int i = 1; i <= n; ++i) s[i].i = i;
    sort(s + 1, s + n + 1, greater<Station>());
    upd(1, n + 1, n + 1, d, 1, n + 1);
    long long res = d;
    for(int i = 1; i <= n; ++i) {
        upd(1, s[i].i, s[i].i, s[i].x, 1, n + 1);
        upd(1, s[i].i + 1, n + 1, -s[i].a, 1, n + 1);
        if(seg[1] <= s[i].b) res = min(res, seg[1]);
    }
    cout << res;

    return 0;
}
#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...