Submission #591734

#TimeUsernameProblemLanguageResultExecution timeMemory
591734l_rehoBoxes with souvenirs (IOI15_boxes)C++14
100 / 100
1443 ms347528 KiB
#include <bits/stdc++.h> using namespace std; long long delivery(int N, int K, int L, int p[]) { vector<long long> dpA(N+1, 0); vector<long long> dpB(N+1, 0); for(int i = 1; i <= N; i++){ if(i >= K){ dpA[i] = dpA[i-K]+p[i-1]*2; }else dpA[i] = dpA[0]+p[i-1]*2; } priority_queue<pair<long long, int>> pq; vector<long long> M(N+1, 0); pq.push({0, N}); for(int i = N-1; i >= 0; i--){ if(i+K > N-1) dpB[i] = dpB[N] + (L-p[i])*2; else dpB[i] = dpB[i+K] + (L-p[i])*2; pq.push({-dpB[i], i}); while(!pq.empty() && pq.top().second > i+K) pq.pop(); M[i] = -pq.top().first; } long long ans = LLONG_MAX; for(int i = 0; i <= N; i++) ans = min(ans, dpA[i] + dpB[i]); for(int i = 0; i < N; i++){ // eliminiamo questo ciclo ans = min(ans, dpA[i] + M[i] + (long long)L); /* for(int j = 1; j <= K; j++){ if(i+j > N) break; ans = min(ans, dpA[i] + dpB[i+j] + (long long)L); } */ } // considerando che L è una costante, bisogna solo cercare i e i+j minimi // posso risolverlo Nlogn return 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...