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