Submission #780332

#TimeUsernameProblemLanguageResultExecution timeMemory
780332egekabasBoxes with souvenirs (IOI15_boxes)C++14
70 / 100
2064 ms169152 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; void calcOneSide(int dist[], ll dp[]){ multiset<ll> minval = {0}; queue<pll> toerase; toerase.push({k-1, 0}); for(int i = 0; i < n; ++i){ dp[i+1] = *minval.begin() + 2*dist[i]; minval.insert(dp[i+1]); toerase.push({i+k, dp[i+1]}); while(toerase.size() && toerase.front().ff == i){ minval.erase(minval.lower_bound(toerase.front().ss)); toerase.pop(); } } } ll leftDp[10000009]; ll rightDp[10000009]; long long delivery(int N, int K, int L, int p[]) { n = N; k = K; l = L; sort(p, p+n); calcOneSide(p, leftDp); reverse(p, p+n); for(int i = 0; i < n; ++i){ p[i] = l-p[i]; } calcOneSide(p, rightDp); 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...