Submission #1234724

#TimeUsernameProblemLanguageResultExecution timeMemory
1234724PenguinsAreCuteLong Distance Coach (JOI17_coach)C++17
71 / 100
341 ms327680 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; long long u[n]; memcpy(u,s,sizeof(u)); for(int i=0;i<n;i++) u[i] %= t; sort(u,u+n); for(int i=0;i<n;i++) { int id = lower_bound(u,u+n+1,s[i]%t)-u; 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; 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; long long dp[m+1][m+1]; memset(dp,1,sizeof(dp)); dp[m][m] = 0; for(int i=m;i;i--) for(int j=i;j<m+1;j++) { dp[i-1][i-1] = min(dp[i-1][i-1],dp[i][j]); int it1 = lower_bound(u,u+n,d[i-1])-u; int it2 = (j==m?n:lower_bound(u,u+n,d[j])-u); long long minT = tree.qry(it1,it2); minT -= (minT % t); minT += d[i-1]; if(minT < 1e17) dp[i-1][j] = dp[i][j] + c[i-1] - (x - minT) / t * w - w; } long long ans = *min_element(dp[0],dp[0]+m+1); 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...