Submission #231029

#TimeUsernameProblemLanguageResultExecution timeMemory
231029peijarBali Sculptures (APIO15_sculpture)C++17
100 / 100
516 ms552 KiB
#include <bits/stdc++.h>
using namespace std;

#define SZ(v) ((int)(v).size())
using ll = long long;

const int MAXP = 60;

int nb_sculptures, min_parti, max_parti;
vector<ll> valeur;

void read_in()
{
	cin >> nb_sculptures >> min_parti >> max_parti;
	valeur.resize(nb_sculptures);

	for (auto &v : valeur)
		cin >> v;
}

void solve_a1(void)
{
	ll cur_prefix=0;
	ll mask=0;
	auto try_prefix = [&](void) 
	{
		vector<int> dp(nb_sculptures+1);
		dp[nb_sculptures] = 0;
		for (int i(nb_sculptures-1); i >= 0; --i)
		{
			dp[i] = 1e9;
			ll sum(0);
			for (int nxt(i); nxt < nb_sculptures; ++nxt)
			{
				sum += valeur[nxt];
				if (((sum & mask) & cur_prefix) == (sum & mask))
					dp[i] = min(dp[i], 1 + dp[nxt+1]);
			}
		}
		return dp[0] <= max_parti;
	};

	for (ll p(MAXP-1); p >= 0; --p)
	{
		mask += (1LL<<p);
		if (!try_prefix())
			cur_prefix += (1LL<<p);
		assert(try_prefix());
	}
	cout << cur_prefix << endl;
}

void solve_a2(void)
{
	ll cur_prefix = 0;
	ll mask=0;
	auto try_prefix = [&](void)
	{
		vector<vector<bool>> dp(nb_sculptures+1, vector<bool>(max_parti+1));
		dp[nb_sculptures][0] = true;
		for (int i(nb_sculptures-1); i >= 0; --i)
			for (int nb_parti(1); nb_parti <= max_parti; ++nb_parti)
			{
				ll sum(0);
				for (int nxt(i); nxt < nb_sculptures; ++nxt)
				{
					sum += valeur[nxt];
					if (((sum & mask) & cur_prefix) == (sum & mask))
						dp[i][nb_parti] = dp[i][nb_parti] | dp[nxt+1][nb_parti-1];
				}
			}
		bool ret = false;
		for (int nb_parti(min_parti); nb_parti <= max_parti; ++nb_parti)
			ret = ret | dp[0][nb_parti];
		return ret;
	};

	for (ll p(MAXP-1); p >= 0; --p)
	{
		mask += (1LL<<p);
		if (!try_prefix())
			cur_prefix += (1LL<<p);
		assert(try_prefix());
	}
	cout << cur_prefix << endl;
}

int main(void)
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	read_in();
	if (min_parti >= 2)
		solve_a2();
	else
		solve_a1();
}
#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...