Submission #1234875

#TimeUsernameProblemLanguageResultExecution timeMemory
1234875PenguinsAreCuteLong Distance Coach (JOI17_coach)C++17
71 / 100
2094 ms16012 KiB
#include <bits/stdc++.h> using namespace std; struct seg { int n; vector<long long> val; seg(int _n): n(_n), val(2*_n,1e18) {} void up(int x, long long u) { for(x+=n;x;x>>=1) val[x] = min(val[x], u); } long long qry(int l, int r) { long long ans = 1e18; for(l+=n,r+=n;l<r;l>>=1,r>>=1) { if(l&1) ans=min(ans,val[l++]); if(r&1) ans=min(ans,val[--r]); } return ans; } }; int main() { long long x, t, w; int n, m; cin >> x >> n >> m >> w >> t; seg tree(n+1); long long s[n+1]; for(int i=0;i<n;i++) cin >> s[i]; s[n++] = x; vector<long long> u(s,s+n); for(int i=0;i<n;i++) u[i] %= t; sort(u.begin(),u.end()); for(int i=0;i<n;i++) { int id = lower_bound(u.begin(),u.end(),s[i]%t)-u.begin(); tree.up(id,s[i]); } pair<long long, long long> ppl[m]; for(int i=0;i<m;i++) cin >> ppl[i].first >> ppl[i].second; vector<long long> d(m), c(m); sort(s,s+n); sort(ppl,ppl+m); for(int i=0;i<m;i++) { d[i] = ppl[i].first, c[i] = ppl[i].second; if(d[i] < (x % t)) c[i] -= w; } vector<long long> pre(m+1); pre[0] = 0; partial_sum(c.begin(),c.end(),pre.begin()+1); long long dp[m+1]; memset(dp,1,sizeof(dp)); dp[m] = 0; auto cst = [&d,&u,&pre,&tree,x,m,n,t,w](int j, int i) -> long long { long long minT = tree.qry(lower_bound(u.begin(),u.end(),d[i-1])-u.begin(),i==m?n:lower_bound(u.begin(),u.end(),d[i])-u.begin()); if(minT > 1e17) return 1e18; minT -= (minT % t); long long ans = pre[i] - pre[j]; ans -= (x - minT) / t * w * (i - j); return ans; }; for(int i=m;i;i--) { long long cur = 0; dp[i-1] = min(dp[i-1], dp[i]); for(int j=i;j--;) dp[j] = min(dp[j], dp[i] + cst(j, i)); } long long ans = dp[0]; ans += w * (x / t + 1); for(int i=0;i<m;i++) ans += w * ((x - d[i]) / t + 1); cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...