Submission #619768

#TimeUsernameProblemLanguageResultExecution timeMemory
619768yanndevBoxes with souvenirs (IOI15_boxes)C++17
100 / 100
586 ms212312 KiB
#include "boxes.h"
#include <bits/stdc++.h>
#define ll long long
using namespace std;

ll delivery(int n, int k, int L, int p[]) {
    vector<int> left {};
    vector<int> right {};
    for (int i = 0; i < n; i++) {
        if (p[i] > L / 2)
            right.push_back(p[i]);
        else
            left.push_back(p[i]);
    }
    if (!right.empty())
        reverse(right.begin(), right.end());

    vector<ll> mLeft {};
    vector<ll> mRight {};
    mLeft.push_back(0);
    mRight.push_back(0);

    for (int i = 0; i < (int)left.size(); i++) {
        mLeft.push_back(2 * left[i]);
        if (i + 1 > k)
            mLeft.back() += mLeft[i + 1 - k];
        //cout << "mleft " << mLeft.back() << '\n';
    }

    for (int i = 0; i < (int)right.size(); i++) {
        mRight.push_back(2 * (L - right[i]));
        if (i + 1 > k)
            mRight.back() += mRight[i + 1 - k];
    }

    ll ans = mLeft.back() + mRight.back();

    for (int lstLeft = max(0, (int)left.size() - k); lstLeft <= (int)left.size(); lstLeft++) {
        //cout << "lst " << lstLeft << '\n';
        int cutFromLeft = (int)left.size() - lstLeft;
        int lstRight = max(0, (int)right.size() - (k - cutFromLeft));
        ll cur = mLeft[lstLeft] + mRight[lstRight] + L;
        ans = min(ans, cur);
    }

    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...