Submission #592079

#TimeUsernameProblemLanguageResultExecution timeMemory
592079tutisUplifting Excursion (BOI22_vault)C++17
10 / 100
2158 ms3164 KiB
/*input 2 5 2 3 1 1 4 */ #pragma GCC optimize ("O3") #pragma GCC target("avx,avx2,fma") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; template <typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; using ll = long long; using ull = unsigned long long; using ld = long double; mt19937_64 rng(0); int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int M; ll L; cin >> M >> L; ll A_[2 * M + 1]; ll* A = A_ + M; for (int i = -M; i <= M; i++) cin >> A[i]; ll pl = 0; pl += A[0]; A[0] = 0; for (int v = M; v >= 1; v--) { if (A[v] > 0 && A[-v] > 0) { ll x = min(A[v] - 1, A[-v] - 1); int t = 0; int d = 0; if (A[v] > A[-v]) t = 1; if (A[-v] > A[v]) d = 1; L -= t * v; L += d * v; A[v] -= x + t; A[-v] -= x + d; pl += 2 * x + t + d; } // while (A[v] > 0 && A[-v] > 0) // { // if (abs(L) < v && A[v] > 0 && A[-v] > 0) // { // ll x = min(A[v] - 1, A[-v] - 1); // A[v] -= x + 1; // A[-v] -= x; // pl += 2 * x + 1; // continue; // } // if (L > 0) // { // ll k = min(A[v], max(1ll, L / v)); // A[v] -= k; // L -= v * k; // pl += k; // } // else // { // ll k = min(A[-v], max(1ll, L / v)); // A[-v] -= k; // L += v * k; // pl += k; // } //} } L = -L; ll cnt = 0; for (int l = -M; l <= M; l++) { L += l * A[l]; cnt += A[l]; } map<ll, ll>D; D[0] = 0; ll del = 30; vector<int>gal; for (int i = -M; i <= M; i++) { if (i != 0) gal.push_back(i); } for (int v = M; v >= 1; v--) for (int l : {v, -v}) { if (l == 0) continue; map<ll, ll>D_; for (pair<ll, ll>v : D) { ll k = (L - v.first) / l; k = max(k, 0ll); k = min(k, A[l]); ll lo = max(0ll, k - del); ll hi = min(k + del, A[l]); for (ll c = lo; c <= hi; c++) { ll v_ = v.first + l * c; ll c_ = v.second + c; if (D_.count(v_) == 0) D_[v_] = c_; else D_[v_] = min(D_[v_], c_); } } D = D_; } if (D.count(L)) cout << pl + cnt - D[L] << "\n"; else cout << "impossible\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...