Submission #576872

#TimeUsernameProblemLanguageResultExecution timeMemory
576872LucppUplifting Excursion (BOI22_vault)C++17
100 / 100
4419 ms6092 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e18;

ll solve(ll M, ll L, vector<ll> a){
    ll sum = 0;
    ll total = 0;
    ll ans = a[M];
    vector<tuple<int, int, int>> art;
    for(int i = 0; i < M; ++i){
        sum += a[i]*(i-M);
        total += a[i]*(i-M);
        ans += a[i];
        art.emplace_back(M-i, min(a[i], 2*M), -1);
    }
    for(int i = (int)M+1; i < 2*M+1; ++i){
        ll take = min(a[i], (L-sum)/(i-M));
        sum += take*(i-M);
        total += a[i]*(i-M);
        ans += take;
        art.emplace_back(M-i, min(take, 2*M), -1);
        if(take < a[i]) art.emplace_back(i-M, min(a[i]-take, 2*M), 1);
    }
    if(total < L) return -INF;

    int MAX = (int)(4*M*M);
    vector<ll> dp(2*MAX+1, -INF);
    dp[MAX+sum-L] = 0;
    for(auto [v, cnt, cost] : art){
        int start = 0;
        if(v < 0) start = (int)(2*MAX+1+v);
        for(int j = start; j < start + abs(v); ++j){
            deque<pair<ll, int>> q;
            for(int k = 0; j+v*k >= 0 && j+v*k < 2*MAX+1; ++k){
                ll x = dp[j+v*k]-cost*k;
                while(!q.empty() && x > q.back().first) q.pop_back();
                q.emplace_back(x, k);
                if(k - q.front().second > cnt) q.pop_front();
                dp[j+v*k] = q.front().first + cost*k;
            }
        }
    }
    ans += dp[MAX];
    return ans;
}

int main(){
    cin.tie(0);
    ios_base::sync_with_stdio(false);
    ll M, L;
    cin >> M >> L;
    vector<ll> a(2*M+1);
    for(int i = 0; i < 2*M+1; ++i) cin >> a[i];
    ll ans = solve(M, L, a);
    reverse(a.begin(), a.end());
    ans = max(ans, solve(M, -L, a));
    if(ans < 0) cout << "impossible\n";
    else cout << ans << "\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...