Submission #54343

#TimeUsernameProblemLanguageResultExecution timeMemory
54343ksun48Long Distance Coach (JOI17_coach)C++14
71 / 100
2065 ms14296 KiB
#include <bits/stdc++.h> typedef long long LL; using namespace std; int main(){ cin.sync_with_stdio(0); cin.tie(0); LL X, N, M, W, T; cin >> X >> N >> M >> W >> T; T *= 2; X *= 2; // X = total duration // N = # stops // M = # passenges vector<LL> stop; stop.push_back(0); for(LL i = 0; i < N; i++){ LL s; cin >> s; s *= 2; stop.push_back(s); } stop.push_back(X); // W = cost vector<pair<LL,LL> > times; LL totalrefundcost = 0; for(LL i = 0; i < M; i++){ LL d, c; cin >> d >> c; d *= 2; totalrefundcost += c; if(X < (X/T) * T + d){ c += W; stop.push_back((X/T) * T + d + 1); } times.push_back({d,c}); } sort(times.begin(), times.end()); sort(stop.begin(), stop.end()); X = ((X/T) + 1) * T; vector<LL> t; vector<LL> refundcost; t.push_back(0); refundcost.push_back(0); // but you must always feed the driver for(int i = 0; i < times.size(); i++){ t.push_back(times[i].first); refundcost.push_back(times[i].second); } t.push_back(T); refundcost.push_back(0); // should not use this result LL rounds = W * (X/T); vector<LL> mincost(refundcost.size(), rounds); for(LL r = 1; r < stop.size(); r++){ LL R = stop[r] % T; LL s = 0; LL e = t.size(); while(s + 1 < e){ LL m = (s + e) / 2; if(t[m] < R) s = m; if(t[m] > R) e = m; } mincost[s] = min(mincost[s], W * (stop[r] / T)); } for(int j = 0; j < refundcost.size(); j++){ refundcost[j] -= rounds; } vector<LL> dp(refundcost.size(), W*(X+1)); dp[0] = 0; for(int j = 1; j < refundcost.size(); j++){ LL cost = 0; LL curcost = rounds; for(int i = j-1; i >= 0 && i >= j - 10000; i--){ dp[j] = min(dp[j], dp[i] + cost - refundcost[i]); curcost = min(curcost, mincost[i]); cost += curcost; } } cout << dp[refundcost.size()-1] + totalrefundcost << '\n'; }

Compilation message (stderr)

coach.cpp: In function 'int main()':
coach.cpp:47:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < times.size(); i++){
                 ~~^~~~~~~~~~~~~~
coach.cpp:56:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(LL r = 1; r < stop.size(); r++){
                ~~^~~~~~~~~~~~~
coach.cpp:67:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int j = 0; j < refundcost.size(); j++){
                 ~~^~~~~~~~~~~~~~~~~~~
coach.cpp:73:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int j = 1; j < refundcost.size(); j++){
                 ~~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...