Submission #1265524

#TimeUsernameProblemLanguageResultExecution timeMemory
1265524phtungFuel Station (NOI20_fuelstation)C++20
100 / 100
276 ms36252 KiB
#include <bits/stdc++.h> using namespace std; struct Seg { int n; vector<long long> mn, lazy; Seg(int n=0): n(n), mn(4*n,0), lazy(4*n,0) {} void push(int p) { if (lazy[p]==0) return; for (int c : {p<<1, (p<<1)|1}) { mn[c] += lazy[p]; lazy[c] += lazy[p]; } lazy[p] = 0; } void build(int p, int l, int r, const vector<long long>& base) { if (l == r) { mn[p] = base[l]; return; } int m = (l+r)>>1; build(p<<1, l, m, base); build(p<<1|1, m+1, r, base); mn[p] = min(mn[p<<1], mn[p<<1|1]); } void add(int p, int l, int r, int ql, int qr, long long v) { if (ql>r || qr<l) return; if (ql<=l && r<=qr) { mn[p] += v; lazy[p] += v; return; } push(p); int m = (l+r)>>1; add(p<<1, l, m, ql, qr, v); add(p<<1|1, m+1, r, ql, qr, v); mn[p] = min(mn[p<<1], mn[p<<1|1]); } long long getMin() { return mn[1]; } }; struct Station { int x; long long a, b; int ix; }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; long long D; cin >> N >> D; vector<Station> st(N); for (int i=0; i<N; i++) cin >> st[i].x >> st[i].a >> st[i].b; st.push_back({(int)D, 0, D, 0}); int M = N+1; sort(st.begin(), st.end(), [](auto &u, auto &v){ return u.x < v.x; }); for (int i=0; i<M; i++) st[i].ix = i; vector<int> ord(M); iota(ord.begin(), ord.end(), 0); sort(ord.begin(), ord.end(), [&](int i,int j){ if (st[i].b != st[j].b) return st[i].b < st[j].b; return st[i].x < st[j].x; }); vector<long long> uniqB; for (int id : ord) { if (uniqB.empty() || uniqB.back() != st[id].b) uniqB.push_back(st[id].b); } long long F = uniqB[0]; vector<long long> base(M); for (int i=0; i<M; i++) base[i] = F - st[i].x; Seg seg(M); seg.build(1, 0, M-1, base); for (int i=0; i<M; i++) { if (i+1 <= M-1 && st[i].a) seg.add(1, 0, M-1, i+1, M-1, st[i].a); } int ptr = 0; while (ptr<M && st[ord[ptr]].b == F) ++ptr; if (seg.getMin() >= 0) { cout << F - seg.getMin() << "\n"; return 0; } int last_cut = 0; for (size_t t=1; t<uniqB.size(); t++) { long long nextF = uniqB[t]; long long delta = nextF - F; seg.add(1, 0, M-1, 0, M-1, delta); for (int k=last_cut; k<ptr; k++) { int i = ord[k], L = st[i].ix + 1; if (L <= M-1 && st[i].a) seg.add(1, 0, M-1, L, M-1, -st[i].a); } last_cut = ptr; while (ptr<M && st[ord[ptr]].b == nextF) ++ptr; F = nextF; if (seg.getMin() >= 0) { cout << F - seg.getMin() << "\n"; return 0; } } cout << F - seg.getMin() << "\n"; }
#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...