Submission #780314

#TimeUsernameProblemLanguageResultExecution timeMemory
780314egekabasBoxes with souvenirs (IOI15_boxes)C++14
10 / 100
1 ms340 KiB
#include "boxes.h" #include <bits/stdc++.h> #define ff first #define ss second #define all(x) (x).begin(), (x).end() #define pb push_back using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef pair<ld, ld> pld; const ll inf = 1e18; int n, k, l; vector<ll> calcOneSide(int dist[]){ vector<ll> dp(n+1); set<pll> minval = {{0, k-1}}; set<pll> toerase = {{k-1, 0}}; for(int i = 0; i < n; ++i){ dp[i+1] = minval.begin()->ff + 2*dist[i]; minval.insert({dp[i], i+k}); toerase.insert({i+k, dp[i]}); while(toerase.size() && toerase.begin()->ff == i){ minval.erase({toerase.begin()->ss, toerase.begin()->ff}); toerase.erase(toerase.begin()); } } return dp; } long long delivery(int N, int K, int L, int p[]) { n = N; k = K; l = L; sort(p, p+n); vector<ll> leftDp = calcOneSide(p); reverse(p, p+n); for(int i = 0; i < n; ++i){ p[i] = l-p[i]; } vector<ll> rightDp = calcOneSide(p); ll ans = inf; for(int i = 0; i <= n; ++i){ ll simpAns = leftDp[i] + rightDp[n-i]; ll compAns = leftDp[i] + l + rightDp[max(0, n-i-k)]; ans = min({ans, simpAns, compAns}); } 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...