제출 #1186244

#제출 시각아이디문제언어결과실행 시간메모리
1186244tamyteUplifting Excursion (BOI22_vault)C++20
0 / 100
10 ms584 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

int main() {
	ll m;
	ll L;
	cin >> m >> L;
	vector<ll> a(2 * m + 2);
	for (int i = -m; i <= m; ++i) {
		cin >> a[i + m];
	}
	vector<ll> ps(2 * m + 2), sum(2 * m + 2);
	vector<ll> b(2 * m + 2);
	for (int i = m; i <= 2 * m; ++i) {
		b[i] = min(a[i], m);
		a[i] -= b[i];
	}
	for (int i = m; i <= 2 * m; ++i) {
		ps[i] += a[i] * (i - m);
		sum[i] += a[i];
		ps[i + 1] += ps[i];
		sum[i + 1] += sum[i];
	}
	vector<ll> dp(m * m * m + 1, LLONG_MIN);
	dp[0] = 0;
	for (int i = m; i <= 2 * m; ++i) {
		for (int _ = 0; _ < b[i]; ++_) {
			int v = i - m;
			for (int k = m * m * m; k >= v; --k) {
				dp[k] = max(dp[k], dp[k - v] + 1);
			}
		}
	}
	ll res = LLONG_MIN;
	for (int i = m; i <= 2 * m; ++i) {
		ll need = L - ps[i];
		// cout << need << " ";
		if (need < 0 || need > m * m * m) continue;
		if (dp[need] == LLONG_MIN) continue;
		res = max(res, dp[need] + sum[i]);
	}
	if (res == LLONG_MIN) {
		cout << "impossible\n";
	} else {
		cout << res << endl;
	}
}
#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...