제출 #727634

#제출 시각아이디문제언어결과실행 시간메모리
727634hoainiemBoxes with souvenirs (IOI15_boxes)C++14
0 / 100
3 ms468 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, cnt = 0; 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; cnt = n = N; for (int i = 1; i < n; i++) assert(p[i] != p[i - 1]); k = K; l = L; if (l % 2 == 0) pmid = l / 2; else pmid = -1; for (int i = 0; i < n && p[i] < l - p[i]; i++){ u.insert(p[i]); vtu.push_back(p[i]); cnt--; } for (int i = n - 1; i >= 0 && p[i] > l - p[i]; i--){ v.insert(l - p[i]); vtv.push_back(l - p[i]); cnt--; } if (pl - pr == 1) return u.cost() + v.cost(); int r = (k - (cnt % k)) % k; res = 1LL * n * (cnt / 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...