Submission #576828

#TimeUsernameProblemLanguageResultExecution timeMemory
576828LucppUplifting Excursion (BOI22_vault)C++14
80 / 100
5053 ms8336 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

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

ll solve(ll M, ll L, vector<ll> a){
    vector<ll> dp(2*MAX+1, -INF);
    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;
            }
        }
    }
    ll ans = -INF;
    if(L <= MAX && L >= -MAX) ans = dp[MAX+L];
    ll sum = 0;
    ll taken = 0;
    for(int i = 0; i < M; ++i){
        if(a[i] > M){
            sum += (a[i]-M)*(i-M);
            taken += a[i]-M;
        }
    }
    for(int i = 1; i <= M; ++i){
        if(L-sum >= -MAX && L-sum <= MAX) ans = max(ans, taken+dp[MAX+L-sum]);
        if(a[M+i] <= M) continue;
        ll take = max(0ll, min(a[M+i]-M, (L-MAX-sum) / i));
        for(; sum+take*i <= L+MAX && take <= a[M+i]-M; take++){
            ll nsum = sum+take*i;
            if(L-nsum >= -MAX && L-nsum <= MAX) ans = max(ans, taken+take+dp[MAX+L-nsum]);
        }
        take--;
        sum += take*i;
        taken += take;
    }
    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...