제출 #943656

#제출 시각아이디문제언어결과실행 시간메모리
943656LucaIlieUplifting Excursion (BOI22_vault)C++17
0 / 100
5038 ms18336 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_M = 300; const int MAX_S = MAX_M * MAX_M; const int MIN_S = -MAX_S; const long long INF = 1e18; unordered_map<int, long long> taken, untaken; unordered_map<int, long long> dpCrt, dpPrv; int main() { int m; long long l, u = 0, t = 0; cin >> m >> l; for ( int i = -m; i <= m; i++ ) { cin >> untaken[i]; u += untaken[i]; } if ( l < 0 ) { for ( int i = 1; i <= m; i++ ) swap( untaken[i], untaken[-i] ); } long long s = 0; for ( int i = -m; i <= 0; i++ ) { long long x = untaken[i]; s += i * x; taken[i] += x; untaken[i] -= x; t += x; u -= x; } for ( int i = 1; i <= m; i++ ) { long long x = min( untaken[i], (l - s) / i ); s += i * x; taken[i] += x; untaken[i] -= x; t += x; u -= x; } if ( s + m < l ) { for ( int i = -m; i < 0; i++ ) { long long x = min( taken[i], (l - s) / (-i) ); s -= i * x; taken[i] -= x; untaken[i] += x; t -= x; u += x; } } for ( int s = MIN_S; s <= MAX_S; s++ ) dpCrt[s] = -INF; dpCrt[0] = 0; for ( int i = -m; i <= 0; i++ ) { swap( dpCrt, dpPrv ); for ( int s = MIN_S; s <= MAX_S; s++ ) dpCrt[s] = -INF; for ( int x = 0; x <= m && x <= untaken[i]; x++ ) { for ( int s = MIN_S; s - i * x <= MAX_S; s++ ) dpCrt[s] = max( dpCrt[s], dpPrv[s - i * x] + x ); } for ( int x = 0; x <= m && x <= taken[i]; x++ ) { for ( int s = MIN_S - i * x; s <= MAX_S; s++ ) dpCrt[s] = max( dpCrt[s], dpPrv[s + i * x] - x ); } /*for ( int s = MIN_S; s <= MAX_S; s++ ) cout << dpCrt[s] << " "; cout << "\n";*/ } for ( int i = 1; i <= m; i++ ) { swap( dpCrt, dpPrv ); for ( int s = MIN_S; s <= MAX_S; s++ ) dpCrt[s] = -INF; for ( int x = 0; x <= m && x <= untaken[i]; x++ ) { for ( int s = MIN_S + i * x; s <= MAX_S; s++ ) dpCrt[s] = max( dpCrt[s], dpPrv[s - i * x] + x ); } for ( int x = 0; x <= m && x <= taken[i]; x++ ) { for ( int s = MIN_S; s + i * x <= MAX_S; s++ ) dpCrt[s] = max( dpCrt[s], dpPrv[s + i * x] - x ); } /*for ( int s = MIN_S; s <= MAX_S; s++ ) cout << dpCrt[s] << " "; cout << "\n";*/ } if ( dpCrt[l - s] < 0 ) cout << "impossible\n"; else cout << t + dpCrt[l - s] << "\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...