/* Author : Mychecksdead */
#include<bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
typedef long long int ll;
typedef long double ld;
#define MOD (1000000000+7)
#define MOD1 (998244353)
#define PI 3.1415926535
#define pb push_back
#define setp() cout << setprecision(15)
#define all(x) x.begin(), x.end()
#define debug(x) cerr << #x << " is " << x << '\n';
const int N = 1e6+100, F = 2147483646, K = 20;
ll m, l, a[N], sum, ans, b[N][2], dp[N]; // + and - parts
void solve(){
cin >> m >> l;
for(int i = 0; i < 2*m+1; ++i) cin >> a[i];
sum = ans = 0;
for(int i = 0; i < 2*m+1; ++i) sum += a[i] * (i - m), ans += a[i], b[i][0] = 0, b[i][1] = a[i];
if(sum == l){
cout << ans;
return;
}
ll c;
if(sum > l){
c = 2*m;
while(sum > l && c > m){
if(c==m){
c--;
continue;
}
if(sum - a[c] * (c - m) >= l) sum -= a[c] * (c - m), ans -= a[c], b[c][0] = a[c], b[c][1] = 0;
else{
ll num = (sum - l + (c - m) - 1) / (c - m);
ans -= num;
sum -= num * (c - m);
b[c][0] = num;
b[c][1] = a[c] - num;
break;
}
c--;
}
}else{
c = 0;
while(sum < l && c < m){
if(c==m){
c++;
continue;
}
if(sum - a[c] * (c - m) <= l) sum -= a[c] * (c - m), ans -= a[c], b[c][0] = a[c], b[c][1] = 0;
else{
ll num = (sum - l) / (c - m);
ans -= num;
sum -= num * (c - m);
b[c][0] = num;
b[c][1] = a[c] - num;
break;
}
c++;
}
}
ll M = 15*m;
if(abs(l - sum) > M){
cout << "impossible";
return;
}
int v = l - sum + M;
for(int i = 0; i <= 2*M; ++i) dp[i] = MOD;
dp[M] = 0;
deque<pair<int, int>> p;
for(int i = 0; i <= 2*m; ++i){
if(i==m) continue;
for(int j = 1; j <= min(b[i][0], M); ++j) p.pb({i - m, -1});
for(int j = 1; j <= min(b[i][1], M); ++j) p.pb({m - i, 1});
}
sort(all(p));
while(!p.empty()){
for(int rep = 0; rep < 2 && !p.empty(); ++rep){
pair<int, int> x;
if(rep == 0) x = p.front(), p.pop_front();
else x = p.back(), p.pop_back();
if(x.first > 0){
for(int j = 2*M; j >= 0; --j){
int val = j + x.first;
if(val >= 0 && val <= 2*M)
dp[val] = min(dp[val], dp[j] + x.second);
}
}else{
for(int j = 0; j <= 2*M; ++j){
int val = j + x.first;
if(val >= 0 && val <= 2*M)
dp[val] = min(dp[val], dp[j] + x.second);
}
}
}
}
if(dp[v] > 1e7) cout << "impossible";
else cout << ans - dp[v];
}
int main(){
cin.tie(0); ios::sync_with_stdio(0);
int T = 1, aa;
freopen("in.txt", "r", stdin);
// cin >> T;aa=T;
while(T--){
// cout << "Case #" << aa-T << ": ";
solve();
cout << '\n';
}
return 0;
}
Compilation message
vault.cpp: In function 'int main()':
vault.cpp:114:16: warning: unused variable 'aa' [-Wunused-variable]
114 | int T = 1, aa;
| ^~
vault.cpp:115:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
115 | freopen("in.txt", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
2 ms |
340 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
2 ms |
340 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
2 ms |
340 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
2 ms |
340 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
2 ms |
340 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
2 ms |
340 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
2 ms |
340 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
2 ms |
340 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
2 ms |
340 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
2 ms |
340 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |