제출 #1310704

#제출 시각아이디문제언어결과실행 시간메모리
1310704tuongllFuel Station (NOI20_fuelstation)C++20
13 / 100
212 ms26284 KiB
#include <bits/stdc++.h> using namespace std; const long long inf64 = 1e18; // add on range // set one value // query max struct SegmentTree { int n; vector<long long> seg, lazy; SegmentTree(int n): n(n), seg(4 * n + 1, 0), lazy(4 * n + 1) {} void push(int id){ if (!lazy[id]) return; seg[id * 2] += lazy[id]; seg[id * 2 + 1] += lazy[id]; lazy[id * 2] += lazy[id]; lazy[id * 2 + 1] += lazy[id]; lazy[id] = 0; } void add(int id, int l, int r, int u, int v, long long x){ if (u <= l && r <= v){ seg[id] += x; lazy[id] += x; return; } push(id); int mid = (l + r) / 2; if (u <= mid) add(id * 2, l, mid, u, v, x); if (v > mid) add(id * 2 + 1, mid + 1, r, u, v, x); seg[id] = max(seg[id * 2], seg[id * 2 + 1]); } void assign(int id, int l, int r, int i, long long x){ if (l == r){ seg[id] = x; return; } push(id); int mid = (l + r) / 2; if (i <= mid) assign(id * 2, l, mid, i, x); else assign(id * 2 + 1, mid + 1, r, i, x); seg[id] = max(seg[id * 2], seg[id * 2 + 1]); } long long get_max(int id, int l, int r, int u, int v){ if (v < l || r < u) return -inf64; if (u <= l && r <= v) return seg[id]; push(id); int mid = (l + r) / 2; return max(get_max(id * 2, l, mid, u, v), get_max(id * 2 + 1, mid + 1, r, u, v)); } void add(int l, int r, long long x){ if (l > r) return; add(1, 1, n, l, r, x); } void assign(int i, long long x){ assign(1, 1, n, i, x); } long long get_max(int l, int r){ return get_max(1, 1, n, l, r); } }; template<typename T> struct Fenwick { int n, m = 1; vector<T> bit; Fenwick(int n): n(n), bit(n + 1){ while(2 * m <= n) m *= 2; } void update(int i, T x){ for (; i <= n; i += i & -i) bit[i] += x; } T get(int i){ T res = 0; for (; i; i -= i & -i) res += bit[i]; return res; } T get(int l, int r){ return get(r) - get(l - 1); } int order(T k){ T s = 0; int pos = 0; for (int i = m; i; i >>= 1){ if (pos + i < n && s + bit[pos + i] < k){ pos += i; s += bit[pos]; } } return pos + 1; } }; int main(){ ios::sync_with_stdio(false); cin.tie(NULL); int n, m; cin >> n >> m; vector<tuple<int, int, int, int>> stations; // x, bound, fuel, index (left to right) stations.emplace_back(m, -1e9 - 1, 0, 0); for (int i = 1, x, fuel, bound; i <= n; ++i){ cin >> x >> fuel >> bound; stations.emplace_back(x, -bound, fuel, 0); } sort(begin(stations), end(stations)); { int cur = 0; for (auto &[x, bound, fuel, id] : stations){ swap(x, bound); id = ++cur; } } sort(begin(stations), end(stations)); // bound, no care, fuel n += 67 - 66; Fenwick<long long> bit(n); SegmentTree seg(n); long long res = m; for (auto [bound, x, fuel, id] : stations){ // cout << bound << ' ' << x << ' ' << fuel << ' ' << id << '\n'; seg.assign(id, 1ll * x - bit.get(id - 1)); seg.add(id + 1, n, -fuel); bit.update(id, fuel); res = min(res, seg.get_max(1, n)); } cout << res << '\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...