제출 #777490

#제출 시각아이디문제언어결과실행 시간메모리
777490boris_mihovBoxes with souvenirs (IOI15_boxes)C++17
20 / 100
2 ms352 KiB
#include "boxes.h" #include <algorithm> #include <iostream> #include <numeric> #include <cassert> #include <vector> typedef long long llong; const int MAXN = 10000000 + 10; const llong INF = 1e18; int n, k, l; std::vector <int> left; std::vector <int> right; llong prefix[MAXN]; llong suffix[MAXN]; llong calcLeft(int to) { llong res = 0; for (int i = 0 ; i <= to ; i += k) { if (i + k - 1 <= to) { res += 2 * left[i + k - 1]; } else { res += 2 * left[to]; } } return res; } llong calcRight(int to) { llong res = 0; for (int i = n - 1 ; i >= to ; i -= k) { if (i - k + 1 >= to) { res += 2 * right[i - k + 1]; } else { res += 2 * right[to]; } } return res; } llong delivery(int N, int K, int L, int p[]) { n = N; k = K; l = L; for (int i = 0 ; i < n ; ++i) { left.push_back(p[i]); right.push_back(l - p[i]); } for (int i = 0 ; i < n ; ++i) { prefix[i] = 2 * left[i]; if (i > 0) { prefix[i] += prefix[i - 1]; if (i % k != 0) { prefix[i] -= 2 * left[i - 1]; } } } for (int i = n - 1 ; i >= 0 ; --i) { suffix[i] = 2 * right[i]; suffix[i] += suffix[i + 1]; if ((n - 1 - i) % k != 0) { suffix[i] -= 2 * right[i + 1]; } } llong ans = calcRight(0); for (int i = 0 ; i < n ; ++i) { ans = std::min(ans, calcLeft(i) + calcRight(i + 1)); } for (int i = 0 ; i + k <= n ; ++i) { llong curr = l + calcRight(i + k); if (i > 0) curr += calcLeft(i - 1); ans = std::min(ans, curr); } return ans; }
#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...