This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e18;
ll solve(ll M, ll L, vector<ll> a){
ll sum = 0;
ll total = 0;
ll ans = a[M];
vector<tuple<int, int, int>> art;
for(int i = 0; i < M; ++i){
sum += a[i]*(i-M);
total += a[i]*(i-M);
ans += a[i];
art.emplace_back(M-i, min(a[i], 2*M), -1);
}
for(int i = (int)M+1; i < 2*M+1; ++i){
ll take = min(a[i], (L-sum)/(i-M));
sum += take*(i-M);
total += a[i]*(i-M);
ans += take;
art.emplace_back(M-i, min(take, 2*M), -1);
if(take < a[i]) art.emplace_back(i-M, min(a[i]-take, 2*M), 1);
}
if(total < L) return -INF;
int MAX = (int)(4*M*M);
vector<ll> dp(2*MAX+1, -INF);
dp[MAX+sum-L] = 0;
for(auto [v, cnt, cost] : art){
int start = 0;
if(v < 0) start = (int)(2*MAX+1+v);
for(int j = start; j < start + abs(v); ++j){
deque<pair<ll, int>> q;
for(int k = 0; j+v*k >= 0 && j+v*k < 2*MAX+1; ++k){
ll x = dp[j+v*k]-cost*k;
while(!q.empty() && x > q.back().first) q.pop_back();
q.emplace_back(x, k);
if(k - q.front().second > cnt) q.pop_front();
dp[j+v*k] = q.front().first + cost*k;
}
}
}
ans += dp[MAX];
return ans;
}
int main(){
cin.tie(0);
ios_base::sync_with_stdio(false);
ll M, L;
cin >> M >> L;
vector<ll> a(2*M+1);
for(int i = 0; i < 2*M+1; ++i) cin >> a[i];
ll ans = solve(M, L, a);
reverse(a.begin(), a.end());
ans = max(ans, solve(M, -L, a));
if(ans < 0) cout << "impossible\n";
else cout << ans << "\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |