Submission #637574

#TimeUsernameProblemLanguageResultExecution timeMemory
637574stoyan_malininLong Distance Coach (JOI17_coach)C++14
16 / 100
1 ms384 KiB
#include <algorithm> #include <iostream> #include <vector> #include <cmath> #include <set> using namespace std; const int MAXN = 2e5; const int64_t inf = 1e18; struct Passanger { int64_t d, c; Passanger(){} Passanger(int64_t d, int64_t c) : d(d), c(c) {} }; int64_t X, n, m, W, T; int64_t sources[MAXN+5]; Passanger passangers[MAXN+5]; Passanger passangersPref[MAXN+5]; int64_t depart[MAXN+5]; int64_t endWaterPoints[MAXN+5]; int64_t endWaterPointsPrefix[MAXN+5]; int findLastPassangerBefore(int64_t rem) { int l = 0, r = m - 1, mid; while(l+1<r) { mid = (l+r)/2; if(passangers[mid].d<rem) l = mid; else r = mid - 1; } if(passangers[r].d<rem) return r; if(passangers[l].d<rem) return l; return -1; } void init() { sort(sources, sources+n); sort(passangers, passangers+m, [](const Passanger& A, const Passanger& B) { if(A.d!=B.d) return A.d<B.d; return A.c<B.c; }); for(int i = 0;i<m;i++) depart[i] = -1; for(int i = 0;i<n;i++) { int ind = findLastPassangerBefore(sources[i]%T); if(ind!=-1 && depart[ind]==-1) depart[ind] = sources[i]; } { int ind = findLastPassangerBefore(X%T); if(ind!=-1 && depart[ind]==-1) depart[ind] = X; } } int64_t dp[MAXN+5]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> X >> n >> m >> W >> T; for(int i = 0;i<n;i++) cin >> sources[i]; for(int i = 0;i<m;i++) cin >> passangers[i].d >> passangers[i].c; init(); int64_t driverWater = X/T + 1; int64_t endWaterPointsSum = 0; for(int i = 0;i<m;i++) { endWaterPoints[i] = ((X-passangers[i].d+(T-1))/T)*T + passangers[i].d; endWaterPointsSum += endWaterPoints[i]; endWaterPointsPrefix[i] = endWaterPoints[i]; if(i!=0) endWaterPointsPrefix[i] += endWaterPointsPrefix[i-1]; } int64_t beginWaterPointsSum = 0; for(int i = 0;i<m;i++) beginWaterPointsSum += passangers[i].d; passangersPref[0] = passangers[0]; for(int i = 1;i<m;i++) { passangersPref[i].d = passangersPref[i-1].d + passangers[i].d; passangersPref[i].c = passangersPref[i-1].c + passangers[i].c; } for(int i = 0;i<m;i++) { dp[i] = inf; if(i!=0) dp[i] = dp[i-1]; else dp[i] = 0; if(depart[i]!=-1) { int64_t based = (depart[i]/T)*T; for(int j = i;j>=0;j--) { int64_t lastDp = ((j==0)?0:dp[j-1]); int64_t lastEWPP = ((j==0)?0:endWaterPointsPrefix[j-1]); int64_t lastC = ((j==0)?0:passangersPref[j-1].c); int64_t lastD = ((j==0)?0:passangersPref[j-1].d); int64_t val = (lastDp*T + T*(passangersPref[i].c-lastC) + based*(i-j+1)*W + (passangersPref[i].d - lastD)*W - (endWaterPointsPrefix[i] - lastEWPP)*W)/T; //changeSum += ((based + passangers[j].d - endWaterPoints[j])/T)*W + passangers[j].c; dp[i] = min(dp[i], val); } } } int64_t ans = dp[m-1] + ((endWaterPointsSum-beginWaterPointsSum)/T)*W + driverWater*W; cout << ans << '\n'; } /* 19 1 4 8 7 10 1 20 2 10 4 5 6 5 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...