Submission #1198689

#TimeUsernameProblemLanguageResultExecution timeMemory
1198689Gr1sen선물상자 (IOI15_boxes)C++20
0 / 100
11 ms324 KiB
#include "boxes.h"
#include<algorithm>
#include<iomanip>
#include<vector>
#include<set>
#include<iterator>
#include<iostream>

using namespace std;

#define ll long long
#define vi vector<ll>
#define vvi vector<vi>
#define ms multiset<int>

ms M;
int glt, grt;
int k, n, l;
ll ans;

ll oink(int le = 1) {
    ans = 0;
    int lt = glt, rt = grt;
    auto it = M.begin();
    int re = n%k-le;
    if (le != 0) {
        advance(it, le-1);
        ans += 2*(*it);
        lt -= le;
        it++;
    }
    while (lt >= k) {
        advance(it, k-1);
        ans += 2*(*it);
        lt -= k;
        it++;
    }
    it = M.end();
    if (re != 0) {
        advance(it, -re);
        ans += 2*(*it);
        rt -= re;
    }
    while (rt >= k) {
        advance(it, -k);
        ans += 2*(l-(*it));
        rt -= k;
    }
    if (lt == 0 && rt == 0) return ans;
    //cerr << "oink ans : " << ans + l << endl;
    return ans + l;
}

ll oinkoink() {
    ans = 0;
    auto it = M.begin();
    advance(it, glt);
    auto it1 = it;
    it++;
    auto it2 = it;
    while (distance(M.begin(), it1) >= k) {
        ans += 2*(*it1);
        advance(it1, -k);
    }
    ans += 2*(*it1);
    while (distance(it2, M.end()) > k) {
        ans += 2*(*it2);
        advance(it2, -k);
    }
    ans += 2*(l-(*it2));
    return ans;
}

ll delivery(int in, int ik, int il, int p[]) {
    k = ik;
    n = in;
    l = il;
    ans = 0;
    M.clear();
    int lh = l/2;
    for (int i = 0; i < n; i++) {
        M.insert(p[i]);
        if (p[i] <= lh) glt++;
        else grt++;
    }
    ll best = oinkoink();
    //cerr << "best no circle : " << best << endl;
    for (int i = 1; i < k; i++) {
        best = min(best, oink(i));
        //cerr << "best: " << best << endl;
    }
    return best;
}
#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...