Submission #1187802

#TimeUsernameProblemLanguageResultExecution timeMemory
1187802tamyteUplifting Excursion (BOI22_vault)C++20
0 / 100
8 ms328 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; unordered_map<int, ll> take, not_take; unordered_map<int, ll> dp, ndp; ll low = -300, high = 300; const ll LINF = -2e18; void add(ll v, ll d) { ndp = dp; for (int i = low; i <= high; ++i) { if (low <= i - v * d && i - v * d <= high) { dp[i] = max(dp[i], ndp[i - v * d] + v); } } for (int i = low; i <= high; ++i) { dp[i] = (dp[i] < 0 ? LINF : dp[i]); } } void sub(ll v, ll d) { ndp = dp; for (int i = low; i <= high; ++i) { if (low <= i + v * d && i + v * d <= high) { dp[i] = max(dp[i], ndp[i + v * d] - v); } } for (int i = low; i <= high; ++i) { dp[i] = (dp[i] < 0 ? LINF : dp[i]); } } int main() { ios::sync_with_stdio(0); cin.tie(0); int m; ll L; cin >> m >> L; ll res = 0; for (int i = -m; i <= m; ++i) { cin >> not_take[i]; } if (L < 0) { for (int i = -m; i <= 0; ++i) { swap(not_take[i], not_take[-i]); } L = -L; } ll sum = 0; for (int i = -m; i <= 0; ++i) { ll now = not_take[i]; sum += now * i; not_take[i] -= now; take[i] += now; res += now; } // cout << "DONE!" << endl; // cout << sum << " " << res << endl; for (int i = 1; i <= m; ++i) { ll now = min(not_take[i], (L - sum) / i); sum += now * i; not_take[i] -= now; take[i] += now; res += now; } // cout << sum << " " << res << endl; if (sum + m < L) { for (int i = -m; i < 0; ++i) { ll now = min(take[i], (L - sum) / (-i)); sum -= now * i; take[i] -= now; not_take[i] += now; res -= now; } } // cout << sum << " " << res << endl; for (int i = low; i <= high; ++i) { dp[i] = ndp[i] = LINF; } dp[0] = ndp[0] = 0; for (int i = -m ; i <= m; ++i) { if (i == 0) continue; ll k, s; s = 0; // cout << dp.size() << " " << ndp.size() << endl; k = min((ll)m, not_take[i]); for (ll j = 0; s + (1 << j) <= k; s += (1 << j), ++j) { add((1 << j), i); } add(k - s, i); s = 0; k = min((ll)m, take[i]); for (ll j = 0; s + (1 << j) <= k; s += (1 << j), ++j) { sub((1 << j), i); } sub(k - s, i); } // for (int i = -10; i <= 10; ++i) { // cout << dp[i] << " "; // } // cout << endl; // cout << L << " " << sum << " = " << dp[L - sum] << endl; if (!dp.count(L - sum) || dp[L - sum] < 0) { cout << "impossible\n"; } else { cout << res + dp[L - sum] << "\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...