Submission #1288094

#TimeUsernameProblemLanguageResultExecution timeMemory
1288094ortsacBoxes with souvenirs (IOI15_boxes)C++20
10 / 100
1 ms580 KiB
#include "boxes.h"
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pii pair<long long, long long>
#define fr first
#define se second

int n, k, l;

int dist(int a, int b) {
    if (a > b) swap(a, b);
    if (a == 0) return min(b, l - b);
    return min(b - a, dist(0, a) + dist(0, b));
}

int delivery(int32_t N, int32_t K, int32_t L, int32_t p[]) {
    n = N, k = K, l = L;
    map<int, int> pos;
    for (int i = 0; i < n; i++) pos[p[i]]++;
    deque<pii> v = {{0, 0}};
    for (auto [a, b] : pos) v.push_back({a, b});
    v.push_back({0, 0});
    int cval, ans, lst;
    deque<pii> bv = v;
    n = v.size(); 
    // run one
    cval = k, ans = 0;
    lst = 0;
    vector<int> pf(n);
    for (int i = 0; i < n; i++) {
        auto& [po, need] = v[i];
        ans += dist(lst, po);
        // get whatever is needed done in here
        while (need > cval) {
            need -= cval;
            ans += 2*dist(0, po);
            cval = k;
        }
        cval -= need;
        need = 0;
        pf[i] = ans;
        // go to next one
        lst = po;
    }
    // run 2
    v = bv;
    vector<int> sf(n);
    cval = k, ans = 0;
    lst = 0;
    for (int i = n - 1; i >= 0; i--) {
        auto& [po, need] = v[i];
        ans += dist(lst, po);
        // get whatever is needed done in here
        while (need > cval) {
            need -= cval;
            ans += 2*dist(0, po);
            cval = k;
        }
        cval -= need;
        need = 0;
        sf[i] = ans;
        // go to next one
        lst = po;
    }
    // calc ans
    int mians = min(pf[n - 1], sf[0]);
    for (int i = 0; i < n; i++) {
        if ((i + 1) < n) mians = min(mians, pf[i] + sf[i + 1] + dist(v[i].fr, 0) + dist(v[i + 1].fr, 0));
        if (i > 0) mians = min(mians, pf[i - 1] + sf[i] + dist(v[i].fr, 0) + dist(v[i - 1].fr, 0));
    }
    // print
    return mians;
}
#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...