# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
356483 | urd05 | Boxes with souvenirs (IOI15_boxes) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "boxes.h"
#include <bits/stdc++.h>
using namespace std;
long long osum[10000001];
long long tsum[10000001];
long long delivery(int n,int k,int l,int p[]) {
long long ret=1LL*((n-1)/k+1)*l;
vector<int> one;
vector<int> two;
one.push_back(0);
two.push_back(0);
for(int i=0;i<n;i++) {
if (p[i]==0) {
continue;
}
if (p[i]<=l/2) {
one.push_back(p[i]);
}
else {
two.push_back(l-p[i]);
}
}
n=one.size()+two.size();
int aind=0;
int bind=0;
for(int i=1;i<one.size();i++) {
if (i>=k) {
osum[i]=osum[i-k]+one[i];
}
else {
osum[i]=one[i];
}
}
for(int i=1;i<two.size();i++) {
if (i>=k) {
tsum[i]=tsum[i-k]+two[i];
}
else {
tsum[i]=two[i];
}
}
int pos=-1;
long long mini=1e18;
for(int i=0;i<=n%k;i++) {
if (i<one.size()&&n%k-i<two.size()&&osum[i]+tsum[n%k-i]<mini) {
mini=osum[i]+tsum[n%k-i];
pos=i;
}
}
aind=i;
bind=n%k-i;
ret=min(ret,mini+1LL*(n/k)*l);
for(int cnt=n/k-1;cnt>=0;cnt--) {
long long mini=1e18;
int pos=-1;
for(int i=0;i<=k;i++) {
if (aind+i<one.size()&&bind+k-i<two.size()&&osum[aind+i]+tsum[bind+k-i]<mini) {
mini=osum[aind+i]+tsum[bind+k-i];
pos=i;
}
}
aind+=pos;
bind+=k-pos;
ret=min(ret,mini+1LL*cnt*l);
}
return ret;
}