Submission #1172515

#TimeUsernameProblemLanguageResultExecution timeMemory
1172515IskachunUplifting Excursion (BOI22_vault)C++20
20 / 100
25 ms584 KiB
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
void solve () {
    int m, l; cin >> m >> l;
    int n = 2 * m + 1;
    vector<int> a(n);
    for (int &x : a) cin >> x;
    int sum = 0;
    vector<int> c(n);
    for (int i = 0; i <= m; i++) sum += (i - m) * a[i], c[i] = a[i];
    for (int i = m + 1; i < n; i++) {
        c[i] = min(a[i], (l - sum) / (i - m));
        sum += c[i] * (i - m);
    }
    for (int i = 0; i < m; i++) {
        int val = min(a[i], (l - sum) / (m - i));
        c[i] -= val;
        sum += val * (m - i);
    }
    if (abs(sum - l) > m) return cout << "impossible", void();
    vector<pair<int, int>> cnt;
    int tot = 0;
    for (int i = 0; i < n; i++) {
        tot += c[i];
        if (i == m) continue;
        int j = 1, s = min(m * m, a[i] - c[i]);
        while (j <= s) {
            cnt.push_back({j * (i - m), j});
            s -= j, j *= 2;
        }
        if (s > 0) cnt.push_back({s * (i - m), s});
        j = 1, s = min(c[i], m * m);
        while (j <= s) {
            cnt.push_back({j * (m - i), -j});
            s -= j, j *= 2;
        }
        if (s > 0) cnt.push_back({s * (m - i), -s});
    }
    int m2 = m * m;
    vector<int> dp(2 * m2 + 10, -1e9), f(2 * m2 + 10, -1e9);
    dp[m2] = f[m2] = 0;
    for (auto [x, y] : cnt) {
        for (int i = 0; i <= 2 * m2; i++) {
            if (i - x <= 2 * m2 and i - x >= 0 and dp[i - x] != -1e9) f[i] = max(f[i], dp[i - x] + y);
        }
        dp = f;
    }
    if (f[l - sum + m2] + tot >= 0) cout << f[l - sum + m2] + tot;
    else cout << "impossible";
}
int main() {
    //freopen("filename.in", "r", stdin), freopen("filename.out", "w", stdout);
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int t = 1; //cin >> t;
    while (t--) solve();

}

#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...