Submission #672069

#TimeUsernameProblemLanguageResultExecution timeMemory
672069LittleCubeUplifting Excursion (BOI22_vault)C++14
100 / 100
505 ms1100 KiB
#include <bits/stdc++.h>
#define ll long long 
#define pii pair<int, int>
#define pll pair<ll, ll>
#define F first
#define S second
using namespace std;

ll M, L, a[605], ans, b[605], dp[100005];

void upd(int count, int v, int w)
{
//	cout << count << "s of " << v << " weighted " << w << '\n';	

	vector<int> cnt;
	for(int j = 1; count >= j; j *= 2)
	{
		cnt.emplace_back(j);
		count -= j;
	}
	cnt.emplace_back(count);
	for(int j : cnt)
		if(v > 0)
			for(int k = M * M; k >= v * j; k--)		
				dp[k] = min(dp[k - v * j] + j * w, dp[k]);
		else if(v < 0)
			for(int k = 0; k <= M * M + v * j; k++)
				dp[k] = min(dp[k - v * j] + j * w, dp[k]);
	//for(int i = 0; i <= M * M; i++)
	//	cout << dp[i] << " \n"[i == M * M];
}


signed main()
{
	// ios::sync_with_stdio(0);
	// cin.tie(0), cout.tie(0);
	cin >> M >> L;
	for(int i = 1; i <= 2 * M + 1; i++)
	   cin >> a[i];
	if(L < 0)
	{
		L = -L;
		for(int i = 1; i <= M; i++)
			swap(a[i], a[2 * M + 2 - i]);
	}	
	for(int i = 1; i <= M; i++)
	{		
		L += a[M + 1 - i] * i, ans += a[M + 1 - i];
		swap(a[M + 1 - i], b[M + 1 - i]);
	}
	//cout << L << '\n';
	
	ans += a[M + 1];
	swap(a[M + 1], b[M + 1]);
	
	for(int i = 1; i <= M; i++)
		if(i * a[M + 1 + i] <= L)
		{
			ans += a[M + 1 + i];
			L -= i * a[M + 1 + i];
			b[M + 1 + i] = min(M, a[M + 1 + i]);
			a[M + 1 + i] = 0;
		}
		else
		{
			ans += L / i;
			b[i + M + 1] = min(M, L / i);
			a[i + M + 1] = min(M, a[i + M + 1] - L / i);
			L %= i;
		}
	for(int i = M; i >= 1; i--)
		if(i * b[M + 1 - i] <= L)
		{
			ans -= b[M + 1 - i];
			L -= i * b[M + 1 - i];
			a[M + 1 - i] = min(M, b[M + 1 - i]);
			b[M + 1 - i] = 0;
		}
		else
		{
			ans -= L / i;
			a[M + 1 - i] = min(M, L / i);
			b[M + 1 - i] = min(M, b[M + 1 - i] - L / i);
			L %= i;
		}
		
	if(L > M)
	{
		cout << "impossible\n";
		return 0;
	}

	//for(int i = 1; i <= M * 2 + 1; i++)
	//	cerr << a[i] << " \n"[i == 2 * M + 1];
	//for(int i = 1; i <= M * 2 + 1; i++)
	//	cerr << b[i] << " \n"[i == 2 * M + 1];
	//cerr << ans << " " << L << '\n';

	for(int i = 0; i <= M * M; i++)
		dp[i] = (i == 0 ? 0 : 1e18);

	for(int i = 1; i <= M; i++)
		upd(a[i + M + 1], i, -1);
	for(int i = 1; i <= M; i++)
		upd(b[M + 1 - i], i, 1);
	for(int i = 1; i <= M; i++)
		upd(b[M + i + 1], -i, 1);
	for(int i = 1; i <= M; i++)
		upd(a[M + 1 - i], -i, -1);

	ans -= dp[L];
	if(ans < 0)
		cout << "impossible\n";
	else cout << ans << '\n';
}
#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...