Submission #541720

#TimeUsernameProblemLanguageResultExecution timeMemory
541720sidonLong Distance Coach (JOI17_coach)C++17
100 / 100
455 ms110504 KiB
#include <bits/stdc++.h> using namespace std; using ll = __int128; const ll INF = 1e18; const int SZ = 2e5+1; ll read() { int64_t x; cin >> x; return x; } struct Line { ll m {}, c {}; ll operator()(const ll &x) { return m * x + c; } }; struct LiChaoTree { ll l, r; Line v; LiChaoTree *L = NULL, *R = NULL; LiChaoTree(ll lv, ll rv) : l(lv), r(rv) {} void insert(Line x) { ll m = (l + r) >> 1; if(v(m) < x(m)) swap(v, x); if(r - l < 2) return; x.m > v.m ? (R ? : R = new LiChaoTree(m, r))->insert(x): (L ? : L = new LiChaoTree(l, m))->insert(x); } ll operator()(const ll &x) { if(r - l < 2) return v(x); ll m = (l + r) >> 1; return x < m ? max(v(x), L ? (*L)(x) : 0): max(v(x), R ? (*R)(x) : 0); } }; int N, M; ll X, W, T, S[SZ], D[SZ], C[SZ]; int main() { cin.tie(0)->sync_with_stdio(0); X = read(), N = read(), M = read(), W = read(), T = read(); vector<pair<ll, int>> a(N+M+1); for(int i = 0; i < N; ++i) { S[i] = read(); a[i+0] = {S[i] % T, i}; } a[N] = {X % T, N}; S[N++] = X; for(int i = 0; i < M; ++i) { D[i] = read(), C[i] = read(); a[i+N] = {D[i] % T, i + N}; } sort(begin(a), end(a), [](const auto &i, const auto &j) { return i.first < j.first; }); LiChaoTree lct(0, X+1); ll cost {}, dp {}, cnt {}, ext = ((X - ll(1)) / T + 1) * W; for(int i = 1; i <= N + M; ++i) { int c = a[i-1].second; if(c < N) { ll f = (S[c] - ll(1)) / T; dp = max(dp, cost - f * cnt * W + lct(f)); } else { c -= N; ++cnt; ll total = ((X - ll(1)) / T) + (D[c] < (X % T)); ext += total * W; cost += total * W - C[c]; } lct.insert(Line{cnt * W, dp - cost}); } cout << int64_t(ext - dp); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...