Submission #576819

#TimeUsernameProblemLanguageResultExecution timeMemory
576819LucppUplifting Excursion (BOI22_vault)C++14
20 / 100
1870 ms8228 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll MAX = 50*100*101;
const ll INF = 1e18;

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];
    vector<ll> dp(2*MAX+1, -INF);
    if(L < -MAX){
        cout << "impossible\n";
        return 0;
    }
    dp[MAX] = 0;
    for(int i = 0; i < 2*M+1; ++i){
        if(i == M){
            for(int j = 0; j < 2*MAX+1; ++j) dp[j] += a[M];
            continue;
        }
        int v = (int)(i-M);
        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]-k;
                while(!q.empty() && x > q.back().first) q.pop_back();
                q.emplace_back(x, k);
                if(k - q.front().second > min(a[i], M)) q.pop_front();
                dp[j+v*k] = q.front().first + k;
            }
        }
    }
    if(L < 0){
        if(dp[L+MAX] < 0) cout << "impossible\n";
        else cout << dp[L+MAX] << "\n";
        return 0;
    }
    ll ans = -INF;
    if(L <= MAX) ans = dp[MAX+L];
    ll sum = 0;
    ll taken = 0;
    for(int i = 1; i <= M; ++i){
        if(a[M+i] <= M) continue;
        ll take = max(0ll, min(a[M+i]-M, (L-MAX-sum) / i));
        for(; sum+take*i <= L && take <= a[M+i]-M; take++){
            ll nsum = sum+take*i;
            if(L-nsum <= MAX) ans = max(ans, taken+take+dp[MAX+L-nsum]);
        }
        sum += take*i;
        taken += taken;
    }
    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...