Submission #576714

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

const int MAX = 50*100*101;
const int INF = 1e8;

int main(){
    cin.tie(0);
    ios_base::sync_with_stdio(false);
    int M; ll L;
    cin >> M >> L;
    vector<int> a(2*M+1);
    for(int i = 0; i < 2*M+1; ++i) cin >> a[i];
    if(L > MAX || L < -MAX){
        cout << "impossible\n";
        return 0;
    }
    vector<int> 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 = i-M;
        int start = 0;
        if(v < 0) start = 2*MAX+1+v;
        for(int j = start; j < start + abs(v); ++j){
            deque<pair<int, int>> q;
            for(int k = 0; j+v*k >= 0 && j+v*k < 2*MAX+1; ++k){
                int 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 > a[i]) q.pop_front();
                dp[j+v*k] = q.front().first + k;
            }
        }
    }
    if(dp[MAX+L] < 0) cout << "impossible\n";
    else cout << dp[MAX+L] << "\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...