Submission #14390

#TimeUsernameProblemLanguageResultExecution timeMemory
14390kriiiBali Sculptures (APIO15_sculpture)C++14
100 / 100
99 ms1116 KiB
#include <stdio.h>

int N,A,B,G[2020]; long long X[2020]; bool gr[101][101];

int main()
{
	scanf ("%d %d %d",&N,&A,&B);
	for (int i=1;i<=N;i++){
		scanf ("%lld",&X[i]);
		X[i] += X[i-1];
	}

	if (A == 1){
		long long ans = 0;
		for (int k=40;k>=0;k--){
			long long want = ans + (1ll << k) - 1;
			for (int i=1;i<=N;i++) G[i] = 10000;
			for (int j=1;j<=N;j++) for (int i=1;i<=j;i++){
				long long see = X[j] - X[i-1];
				if ((see | want) == want){
					if (G[j] > G[i-1] + 1)
						G[j] = G[i-1] + 1;
				}
			}
			if (G[N] > B) ans += (1ll << k);
		}
		printf ("%lld\n",ans);
	}
	else{
		long long ans = 0;
		for (int k=40;k>=0;k--){
			long long want = ans + (1ll << k) - 1;
			gr[0][0] = 1;
			for (int i=1;i<=N;i++) for (int j=0;j<=B;j++) gr[j][i] = 0;
			for (int j=1;j<=N;j++) for (int i=1;i<=j;i++){
				long long see = X[j] - X[i-1];
				if ((see | want) == want){
					for (int l=0;l<B;l++) if (gr[l][i-1]) gr[l+1][j] = 1;
				}
			}
			bool good = 0;
			for (int i=A;i<=B;i++) if (gr[i][N]) good = 1;
			if (!good) ans += (1ll << k);
		}
		printf ("%lld\n",ans);
	}

	return 0;
}
#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...