Submission #1288099

#TimeUsernameProblemLanguageResultExecution timeMemory
1288099ortsacBoxes with souvenirs (IOI15_boxes)C++20
10 / 100
2 ms584 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 v = bv; cval = k, ans = 0; lst = 0; vector<int> pf(n), repf(n), pf2(n), arrPf(n); for (int i = 0; i < n; i++) { auto& [po, need] = v[i]; ans += dist(lst, po); // get whatever is needed done in here pf2[i] = ans; arrPf[i] = cval; repf[i] = max(0LL, need - cval); 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), resf(n), sf2(n), arrSf(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 sf2[i] = ans; arrSf[i] = cval; resf[i] = max(0LL, need - cval); 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 for remaining stuff int mians = min(pf[n - 1], sf[0]); for (int i = 0; i < n; i++) { int po = v[i].fr; int qsf = 0, qpf = 0, nans = 0; // did pf first, now sf cval = arrSf[i]; // quando o sf tinha isso de cval nans = pf2[i] + sf2[i] + 2*dist(v[i].fr, 0); while (repf[i] > cval) { repf[i] -= cval; nans += 2*dist(0, po); cval = k; } mians = min(mians, nans); // did sf first, now pf cval = arrPf[i]; // quando o pf tinha isso de cval nans = pf2[i] + sf2[i] + 2*dist(v[i].fr, 0); while (resf[i] > cval) { resf[i] -= cval; nans += 2*dist(0, po); cval = k; } mians = min(mians, nans); } // calc ans 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 //cout << mians << "\n"; 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...