# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1192570 | Joon_Yorigami | Boxes with souvenirs (IOI15_boxes) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll delivery(ll n, ll k, ll l, ll* positions)
{
vector<pair<ll,ll>> left;
vector<pair<ll,ll>> right;
map<ll,ll> memo;
ll num;
for(ll i=0;i<n;i++)
{
num=positions[i];
if(memo.find(num)==memo.end())
{
memo[num]=1;
}
else
{
memo[num]+=1;
}
}
for(auto p:memo)
{
if(p.first<=l/2)
{
left.push_back(p);
}
else
{
right.push_back(p);
}
}
ll leftoverright,leftoverleft,ans;
ans=0;
leftoverright=0;
leftoverleft=0;
reverse(right.begin(),right.end());
for(ll i=left.size()-1;i>=0;i--)
{
if(leftoverleft>0)
{
left[i].second-=leftoverleft;
leftoverleft=0;
}
if(left[i].second<0)
{
leftoverleft=abs(left[i].second);
continue;
}
ans+=(left[i].second+k-1)/k*2*left[i].first;
leftoverleft=0;
if(left[i].second%k>0)
{
leftoverleft=k-(left[i].second%k);
}
}
for(ll i=right.size()-1;i>=0;i--)
{
if(leftoverright>0)
{
right[i].second-=leftoverright;
leftoverright=0;
}
if(right[i].second<0)
{
leftoverright=abs(right[i].second);
continue;
}
ans+=(right[i].second+k-1)/k*2*(l-right[i].first);
leftoverright=0;
if(right[i].second%k>0)
{
leftoverright=k-(right[i].second%k);
}
}
if(right.size()>0 && left.size()>0 && leftoverleft>0 && leftoverright>0 && leftoverleft>=(k-leftoverright) && l<left.back().first*2+(l-right.back().first)*2)
{
ans-=left.back().first*2+(l-right.back().first)*2;
ans+=l;
}
return ans;
}
/*
int main()
{
ll n,k,l,owo;
ll positions[10000];
cin >> n >> k >> l;
for(ll i=0;i<n;i++)
{
cin >> owo;
positions[i]=owo;
}
cout << delivery(n,k,l,positions) << endl;
}
*/