Submission #46578

#TimeUsernameProblemLanguageResultExecution timeMemory
46578aomeBali Sculptures (APIO15_sculpture)C++17
100 / 100
136 ms2448 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 2005;

int n, A, B;
int arr[N];
long long sum[N];

namespace Task1 {

	bool f[N][N];

	void calDP(long long mask) {
		f[0][0] = 1;
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= i; ++j) {
				f[i][j] = 0;
			}
		}
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= i; ++j) {
				for (int k = 0; k < i; ++k) {
					if ((sum[i] - sum[k]) & mask) continue;
					f[i][j] |= f[k][j - 1]; 
				}
			}
		}
	}

	void solve() {
		long long mask = 0, res = 0;
		for (int i = 45; i >= 0; --i) {
			mask ^= (1LL << i);
			calDP(mask);
			bool found = 0;
			for (int j = A; j <= B; ++j) found |= f[n][j];
			if (!found) {
				mask ^= (1LL << i), res += 1LL << i;
			}
		}
		cout << res;
	}
}

namespace Task2 {
	const int INF = 1e9;

	int f[N];

	void calDP(long long mask) {
		f[0] = 0;
		for (int i = 1; i <= n; ++i) {
			f[i] = INF;
			for (int j = 0; j < i; ++j) {
				if ((sum[i] - sum[j]) & mask) continue;
				f[i] = min(f[i], f[j] + 1);
			}
		}
	}

	void solve() {
		long long mask = 0, res = 0;
		for (int i = 45; i >= 0; --i) {
			mask ^= (1LL << i);
			calDP(mask);
			bool found = f[n] <= B;
			if (!found) {
				mask ^= (1LL << i), res += 1LL << i;
			}			
		}
		cout << res << '\n';
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin >> n >> A >> B;
	for (int i = 1; i <= n; ++i) cin >> arr[i];
	for (int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + arr[i];
	if (n <= 100) 
		Task1::solve();
	else 
		Task2::solve();
}
#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...