Submission #1130510

#TimeUsernameProblemLanguageResultExecution timeMemory
1130510am_aadvikBali Sculptures (APIO15_sculpture)C++17
100 / 100
115 ms472 KiB
#include <iostream>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<set>
#include<algorithm>
#include<math.h>
#define int long long
const int inf = 1e17;
const int maxn = 300005;
const int mod = (int)1e9 + 7;
using namespace std;

int n, a, b;
vector<int> arr;

bool minp(int mask) {
	vector<int> dp(n + 1, inf);
	dp[n] = 0;
	for (int i = n - 1; i >= 0; --i) {
		int sum = arr[i];
		for (int j = i; j < n; ++j) {
			if((sum & mask) == sum)
				dp[i] = min(dp[i], 1 + dp[j + 1]);
			if (j < (n - 1)) sum += arr[j + 1];
		}
	}
	return (dp[0] <= b);
}

bool rangep(int mask) {
	vector<vector<bool>> dp(n + 1, vector<bool>(b + 1, 0));
	dp[n][0] = 1;
	for (int i = n - 1; i >= 0; --i)
		for (int j = 1; j <= b; ++j) {
			int sum = arr[i];
			for (int l = i; l < n; ++l) {
				if ((sum & mask) == sum)
					dp[i][j] = (dp[i][j] || dp[l + 1][j - 1]);
				if (j < (n - 1)) sum += arr[l + 1];
			}
		}
	bool ans = 0;
	for (int i = a; i <= b; ++i) ans |= dp[0][i];
	return ans;
}

int32_t main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	cin >> n >> a >> b;
	arr.resize(n);
	for (int i = 0; i < n; ++i) cin >> arr[i];

	int res = ((1ll << 50ll) - 1ll);
	for (int i = 49; i >= 0; --i) {
		int nw = res - (1ll << i);
		bool cur = 0;
		if (a == 1) cur = minp(nw);
		else cur = rangep(nw);
		if (cur) res = nw;
	}
	cout << res;
}
#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...