# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1191657 | gelov | Boxes with souvenirs (IOI15_boxes) | C++20 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
using namespace std;
using ll = long long int;
ll numCheckpoints, stepSize, trackLength;
vector<ll> forwardDistances, backwardDistances;
vector<ll> memoForward, memoBackward;
ll computeForwardTime(ll idx) {
if (idx < 0) return 0;
if (memoForward[idx] != -1) return memoForward[idx];
return memoForward[idx] = 2LL * forwardDistances[idx] + computeForwardTime(idx - stepSize);
}
ll computeBackwardTime(ll idx) {
if (idx < 0) return 0;
if (memoBackward[idx] != -1) return memoBackward[idx];
return memoBackward[idx] = 2LL * backwardDistances[idx] + computeBackwardTime(idx - stepSize);
}
ll delivery(ll numCheckpoints, ll stepSize, ll trackLength) {
for (ll i = 0; i < numCheckpoints; i++) {
ll pos;
cin >> pos;
if (pos == 0 || pos == trackLength) continue;
if (2 * pos > trackLength)
backwardDistances.push_back(trackLength - pos);
else
forwardDistances.push_back(pos);
}
sort(forwardDistances.begin(), forwardDistances.end());
sort(backwardDistances.begin(), backwardDistances.end());
memoForward.assign(forwardDistances.size(), -1);
memoBackward.assign(backwardDistances.size(), -1);
ll fCount = forwardDistances.size();
ll bCount = backwardDistances.size();
ll result = computeForwardTime(fCount - 1) + computeBackwardTime(bCount - 1);
for (ll i = 0; i <= stepSize; ++i) {
ll skipF = fCount - 1 - i;
ll skipB = bCount - 1 - (stepSize - i);
ll timeF = computeForwardTime(skipF);
ll timeB = computeBackwardTime(skipB);
result = min(result, timeF + timeB + trackLength);
}
return result;
}