Submission #727627

#TimeUsernameProblemLanguageResultExecution timeMemory
727627hoainiemBoxes with souvenirs (IOI15_boxes)C++14
0 / 100
4 ms340 KiB
#include "boxes.h" #include <bits/stdc++.h> #define nmax 10000008 const long long inf = 1e18; using namespace std; int n, k, l, pl, pr, pmid, d[nmax]; long long res, ans; struct container{ long long cur, sz, sum[nmax]; void insert(int x){ sz++; cur--; if (cur < 0) cur += k; sum[cur] += x; } void erase(int x){ sum[cur] -= x; cur++; if (cur >= k) cur -= k; sz--; } long long cost(){ return sum[cur] * 2; } }u, v; vector<int>vtu, vtv; stack<int>s; long long delivery(int N, int K, int L, int p[]) { ans = inf; n = N; k = K; l = L; for (int i = 0; i < n; i++) d[p[i]]++; if (l & 1){ pl = l / 2; pr = pl + 1; } else{ pl = l / 2 - 1; pr = pl + 2; pmid = l / 2; } for (int i = 0; i <= pl; i++) for (int j = 1; j <= d[i]; j++){ u.insert(i); vtu.push_back(i); } for (int i = l - 1; i >= pr; i--) for (int j = 1; j <= d[i]; j++){ v.insert(l - i); vtv.push_back(l - i); } if (pl - pr == 1) return u.cost() + v.cost(); int r = (k - (d[pmid] % k)) % k; res = 1LL * n * (d[pmid] / k); if (!r) return res + u.cost() + v.cost(); for (int i = 1; i <= r; i++){ u.erase(vtu.back()); s.push(vtu.back()); vtu.pop_back(); } ans = min(ans, res + u.cost() + v.cost()); for (int i = 1; i <= r; i++){ u.insert(s.top()); s.pop(); v.erase(vtv.back()); ans = min(ans, res + u.cost() + v.cost()); } return res; }
#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...