제출 #592079

#제출 시각아이디문제언어결과실행 시간메모리
592079tutisUplifting Excursion (BOI22_vault)C++17
10 / 100
2158 ms3164 KiB
/*input
2 5
2 3 1 1 4

*/

#pragma GCC optimize ("O3")
#pragma GCC target("avx,avx2,fma")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
template <typename T>
using oset = tree<T,  null_type,  less<T>,  rb_tree_tag,  tree_order_statistics_node_update>;

using ll = long long;
using ull = unsigned long long;
using ld = long double;
mt19937_64 rng(0);
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int M;
	ll L;
	cin >> M >> L;
	ll A_[2 * M + 1];
	ll* A = A_ + M;
	for (int i = -M; i <= M; i++)
		cin >> A[i];
	ll pl = 0;
	pl += A[0];
	A[0] = 0;
	for (int v = M; v >= 1; v--)
	{
		if (A[v] > 0 && A[-v] > 0)
		{
			ll x = min(A[v] - 1, A[-v] - 1);
			int t = 0;
			int d = 0;
			if (A[v] > A[-v])
				t = 1;
			if (A[-v] > A[v])
				d = 1;
			L -= t * v;
			L += d * v;
			A[v] -= x + t;
			A[-v] -= x + d;
			pl += 2 * x + t + d;
		}
		// while (A[v] > 0 && A[-v] > 0)
		// {
		// 	if (abs(L) < v && A[v] > 0 && A[-v] > 0)
		// 	{
		// 		ll x = min(A[v] - 1, A[-v] - 1);
		// 		A[v] -= x + 1;
		// 		A[-v] -= x;
		// 		pl += 2 * x + 1;
		// 		continue;
		// 	}
		// if (L > 0)
		// {
		// 	ll k = min(A[v], max(1ll, L / v));
		// 	A[v] -= k;
		// 	L -= v * k;
		// 	pl += k;
		// }
		// else
		// {
		// 	ll k = min(A[-v], max(1ll, L / v));
		// 	A[-v] -= k;
		// 	L += v * k;
		// 	pl += k;
		// }
		//}
	}

	L = -L;
	ll cnt = 0;
	for (int l = -M; l <= M; l++)
	{
		L += l * A[l];
		cnt += A[l];
	}
	map<ll, ll>D;
	D[0] = 0;
	ll del = 30;
	vector<int>gal;
	for (int i = -M; i <= M; i++)
	{
		if (i != 0)
			gal.push_back(i);
	}
	for (int v = M; v >= 1; v--)
		for (int l : {v, -v})
		{
			if (l == 0)
				continue;
			map<ll, ll>D_;
			for (pair<ll, ll>v : D)
			{
				ll k = (L - v.first) / l;
				k = max(k, 0ll);
				k = min(k, A[l]);
				ll lo = max(0ll, k - del);
				ll hi = min(k + del, A[l]);
				for (ll c = lo; c <= hi; c++)
				{
					ll v_ = v.first + l * c;
					ll c_ = v.second + c;
					if (D_.count(v_) == 0)
						D_[v_] = c_;
					else
						D_[v_] = min(D_[v_], c_);
				}
			}
			D = D_;
		}
	if (D.count(L))
		cout << pl + cnt - D[L] << "\n";
	else
		cout << "impossible\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...