Submission #431687

#TimeUsernameProblemLanguageResultExecution timeMemory
431687tqbfjotldLong Distance Coach (JOI17_coach)C++14
71 / 100
293 ms112792 KiB
#include <bits/stdc++.h> using namespace std; #define int long long int X,N,M,W,T; int refill_points[200005]; int init_t[200005]; int cost[200005]; int cost_pref[200005]; int cost_2[200005]; vector<pair<int,int> > points; vector<pair<int,pair<int,int> > > passenger_mod; vector<int> tvals; int memo[2005][2005]; int val[200005]; int func(int pos, int vv){ if (pos==-1) return 0; if (memo[pos][vv]!=-1) return memo[pos][vv]; int curans = func(pos-1,tvals.size())+cost_2[pos]; if (vv!=tvals.size()){ curans = min(curans,W*tvals[vv]+func(pos-1,vv)+cost[pos]); } if (val[pos]!=-1){ int v2 = min(vv,(int)(lower_bound(tvals.begin(),tvals.end(),val[pos])-tvals.begin())); curans = min(curans,W*tvals[v2]+func(pos-1,v2)+cost[pos]); } //printf("func %lld %lld, %lld = %lld\n",pos,vv,tvals[vv],curans); return memo[pos][vv] = curans; } main(){ scanf("%lld%lld%lld%lld%lld",&X,&N,&M,&W,&T); refill_points[0] = 0; for (int x = 1; x<=N; x++){ scanf("%lld",&refill_points[x]); } N++; refill_points[N] = X; sort(refill_points,refill_points+N+1); for (int x = 0; x<M; x++){ int a,b; scanf("%lld%lld",&a,&b); passenger_mod.push_back({a%T,{a,b}}); } sort(passenger_mod.begin(),passenger_mod.end()); for (int x = 0; x<M; x++){ init_t[x] = passenger_mod[x].second.first; cost[x] = passenger_mod[x].second.second; if (x==0) cost_pref[x] = cost[x]; else cost_pref[x] = cost_pref[x-1]+cost[x]; } for (int x = 0; x<=N; x++){ int num = lower_bound(passenger_mod.begin(),passenger_mod.end(),make_pair(refill_points[x]%T+1,make_pair(-1LL,-1LL)))-passenger_mod.begin(); points.push_back({num,refill_points[x]/T}); } /* set<pair<int,int> > prev_stuff; prev_stuff.insert({0,0}); for (int x = 1; x<=N; x++){ auto it = prev_stuff.upper_bound({points[x].first,points[x].second}); it--; int ind = (*it).second; memo[x] = memo[ind]+(points[x].first-points[ind].first)*(points[x].second); prev_stuff.insert({points[x].first,x}); printf("memo %lld = %lld * %lld = %lld\n",x,points[x].first-points[ind].first,points[x].second,memo[x]); } */ for (int x = M-1; x>=0; x--){ cost_2[x] = X/T+(X%T>init_t[x]%T?1:0); cost_2[x] *= W; // printf("cost_2 %lld = %lld\n",x,cost_2[x]); } /* int finans = 999999999999999999LL; for (int x = 0; x<=N; x++){ finans = min(finans,W*memo[x]+(points[x].first==0?0:cost_pref[points[x].first-1])+W*cost_2[points[x].first]+W*(X/T+1)); printf("now finans = %lld\n",finans); } printf("%lld\n",finans); */ memset(val,-1,sizeof(val)); for (auto x : points){ if (x.first!=0LL) { if (val[x.first-1]==-1){ val[x.first-1] = x.second; } else val[x.first-1] = min(val[x.first-1],x.second); } tvals.push_back(x.second); // printf("set val %lld to %lld,%lld\n",x.first-1,val[x.first-1],x.second); } sort(tvals.begin(),tvals.end()); memset(memo,-1,sizeof(memo)); printf("%lld\n",func(M-1,tvals.size())+W*(X/T+1)); }

Compilation message (stderr)

coach.cpp: In function 'long long int func(long long int, long long int)':
coach.cpp:22:11: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   22 |     if (vv!=tvals.size()){
      |         ~~^~~~~~~~~~~~~~
coach.cpp: At global scope:
coach.cpp:33:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   33 | main(){
      | ^~~~
coach.cpp: In function 'int main()':
coach.cpp:34:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   34 |     scanf("%lld%lld%lld%lld%lld",&X,&N,&M,&W,&T);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
coach.cpp:37:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   37 |         scanf("%lld",&refill_points[x]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
coach.cpp:44:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   44 |         scanf("%lld%lld",&a,&b);
      |         ~~~~~^~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...