제출 #577866

#제출 시각아이디문제언어결과실행 시간메모리
577866vanicUplifting Excursion (BOI22_vault)C++14
0 / 100
282 ms500440 KiB
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cassert> #include <cstring> using namespace std; const int maxn=105, maxval=6e5; typedef long long ll; int a[maxn*2]; int dp[maxval][maxn]; void dodaj1(int br, int x){ for(int i=x; i<maxn; i++){ for(int j=1; j<=br; j++){ if(dp[i-x][j-1]!=-1){ dp[i][j]=dp[i-x][j-1]+1; } } } for(int i=0; i<maxn; i++){ int maksi=-1; for(int j=0; j<=br; j++){ maksi=max(maksi, dp[i][j]); dp[i][j]=-1; } dp[i][0]=maksi; } } void dodaj2(int br, int x){ for(int i=maxn-x-1; i>=0; i--){ for(int j=1; j<=br; j++){ if(dp[i+x][j-1]!=-1){ dp[i][j]=dp[i+x][j-1]+1; } } } for(int i=0; i<maxn; i++){ int maksi=-1; for(int j=0; j<=br; j++){ maksi=max(maksi, dp[i][j]); dp[i][j]=-1; } dp[i][0]=maksi; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); memset(dp, -1, sizeof(dp)); dp[0][0]=0; int n; ll l; cin >> n >> l; assert(n<maxn); for(int i=0; i<n*2+1; i++){ cin >> a[i]; assert(a[i]<maxn); } if(l<0){ l=-l; for(int i=0; i<n; i++){ dodaj1(a[i], n-i); } for(int i=n+1; i<n*2+1; i++){ dodaj2(a[i], i-n); } } else{ for(int i=n+1; i<n*2+1; i++){ dodaj1(a[i], i-n); } for(int i=0; i<n; i++){ dodaj2(a[i], n-i); } } if(l>=maxval || dp[l][0]==-1){ cout << "impossible\n"; } else{ cout << dp[l][0]+a[n] << '\n'; } return 0; }
#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...