Submission #109884

#TimeUsernameProblemLanguageResultExecution timeMemory
109884SaboonBali Sculptures (APIO15_sculpture)C++14
50 / 100
927 ms8356 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int maxn = 2000 + 10;
const ll inf = 1e18;

bool g[maxn][maxn], cp[maxn][maxn];
ll a[maxn], dp[110][110];
int pd[maxn];

int shortest_path(int n, int A, int B){
	if (A == 1){
		for (int i = 1; i <= n; i++)
			pd[i] = n + 1;
		pd[0] = 0;
		for (int i = 1; i <= n; i++)
			for (int j = 0; j < i; j++)
				if (g[j][i])
					pd[i] = min(pd[i], pd[j] + 1);
		return pd[n] <= B;
	}
	memset(dp, 0, sizeof dp);
	dp[0][0] = 1;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= B; j++)
			for (int k = i - 1; k >= 0; k--)
				dp[i][j] |= dp[k][j - 1];
	int ret = 0;
	for (int i = A; i <= B; i++)
		ret |= dp[n][i];
	return ret;
}

int main(){
	ios_base::sync_with_stdio(false);
	int n, A, B;
	cin >> n >> A >> B;
	for (int i = 1; i <= n; i++){
		cin >> a[i];
		a[i] += a[i - 1];
	}
	for (int i = 0; i <= n; i++)
		for (int j = i + 1; j <= n; j++)
			g[i][j] = 1;
	ll untilnow = 0;
	for (int i = 60; i >= 0; i--){
		for (int j = 0; j <= n; j++)
			for (int k = 0; k <= n; k++)
				cp[j][k] = g[j][k];
		for (int j = 0; j <= n; j++)
			for (int k = j + 1; k <= n; k++)
				if ((a[k] - a[j]) & (1ll << i))
					g[j][k] = 0;
		if (!shortest_path(n, A, B)){
			untilnow += (1ll << i);
			for (int j = 0; j <= n; j++)
				for (int k = 0; k <= n; k++)
					g[j][k] = cp[j][k];
		}
	}
	cout << untilnow << endl;
}
#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...