Submission #669404

#TimeUsernameProblemLanguageResultExecution timeMemory
669404errayUplifting Excursion (BOI22_vault)C++17
50 / 100
726 ms596 KiB
// author: erray #undef DEBUG #include <bits/stdc++.h> #ifdef DEBUG #include "debug.h" #else #define debug(...) void(37) #endif using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(0); int M; long long L; cin >> M >> L; vector<long long> neg(M), pos(M); long long banked = 0; for (int i = 0; i < M; ++i) { cin >> neg[M - i - 1]; } cin >> banked; for (int i = 0; i < M; ++i) { cin >> pos[i]; } if (L < 0) { swap(neg, pos); L = -L; } const int inf = int(1e9); vector<int> dp(M * M + 1, -inf); dp[0] = 0; auto Push = [&](int x, long long c, int delta) { bool rev = false; if (x < 0) { rev = true; x = -x; reverse(dp.begin(), dp.end()); } for (int r = 0; r < x; ++r) { deque<pair<int, int>> dq; for (int i = r, ps = 0; i < int(dp.size()); i += x, ++ps) { int push = dp[i] + (ps * -delta); while (!dq.empty() && dq.back().first <= push) { dq.pop_back(); } dq.emplace_back(push, ps); if (ps > c) { int rem = ps - c - 1; if (dq.front().second == rem) { dq.pop_front(); } } dp[i] = dq.front().first + (delta * ps); } } if (rev) { reverse(dp.begin(), dp.end()); } }; auto Value = [&](vector<long long> x) { long long res = 0; for (int i = 0; i < M; ++i) { res += (i + 1) * x[i]; } return res; }; if (Value(pos) - Value(neg) < L) { swap(pos, neg); L = -L; } debug(L, pos, neg); for (int i = 0; i < M; ++i) { L += (i + 1) * neg[i]; banked += neg[i]; } debug(L, banked); vector<long long> dec(M); for (int i = 0; i < M; ++i) { dec[i] = min(pos[i], L / (i + 1)); L -= dec[i] * (i + 1); pos[i] -= dec[i]; banked += dec[i]; } debug(pos, dec, L, banked); assert(L >= 0); for (int i = 0; i < M; ++i) { Push(i + 1, neg[i], -1); } for (int i = 0; i < M; ++i) { Push(i + 1, pos[i], +1); } for (int i = 0; i < M; ++i) { Push(-(i + 1), dec[i], -1); } if (dp[L] == -inf) { cout << "impossible\n"; } else { cout << banked + dp[L] << '\n'; } }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...