Submission #25493

#TimeUsernameProblemLanguageResultExecution timeMemory
25493gabrielsimoesBali Sculptures (APIO15_sculpture)C++14
100 / 100
149 ms9864 KiB
#include <bits/stdc++.h>
using namespace std;
 
typedef signed char sc;
typedef long long ll;
 
const int MAXN = 2001;
const sc MINLOG = -1;
const sc MAXLOG = 44;
#define most(a) (63 - __builtin_clzll(a))
#define sum(i, j) (v[j] - v[i-1])
 
int N, A, B;
ll v[MAXN]; 
ll x;

sc cost(int i, int j) {
	ll a = sum(i,j)&~x;
	if (a != 0) return most(a);
	else return MINLOG;
}

bool ok[MAXN][MAXN];
sc dp[MAXN][MAXN]; 
sc f(int i, int g) {
	if (i > N)
		return (g < A | g > B)?MAXLOG:MINLOG;
 
	if (ok[i][g]) return dp[i][g];
	ok[i][g] = 1;
 
	dp[i][g] = MAXLOG;
	for (int j = i; j <= N; j++)
		dp[i][g] = min(dp[i][g], max(cost(i, j), f(j+1, g+1)));
 
	return dp[i][g];
}

bool oka1[MAXN];
int dpa1[MAXN];
int fa1(int i) {
	if (i > N) return 0;
	if (oka1[i]) return dpa1[i];
	oka1[i] = 1;
 
	dpa1[i] = MAXN;
	for (int j = i; j <= N; j++)
		if ((sum(i,j)|x) == x)
			dpa1[i] = min(dpa1[i], 1 + fa1(j+1));
 
	return dpa1[i];
}
 
int main()
{
	scanf("%d %d %d", &N, &A, &B);
	for (int i = 1; i <= N; i++)
		scanf("%d", &x), v[i] = v[i-1] + x;
		
	if (A != 1) {
		sc lim = most(v[N]) + 1;
		x = 0;		
		while (lim > 0) {
			memset(ok, 0, sizeof(ok));
			lim = f(1,0);
			if (lim != MINLOG)
				x |= (1LL << lim);
		}
	} else {
		sc lim = most(v[N]) + 1;
		x = (1LL << lim) - 1;
		for (int i = lim-1; i >= 0; i--) {
			memset(oka1, 0, sizeof(oka1));
			x ^= (1LL << i);
			if (fa1(1) > B)
				x ^= (1LL << i);
		}
	}
			
	printf("%lld\n", x);
}

Compilation message (stderr)

sculpture.cpp: In function 'sc f(int, int)':
sculpture.cpp:27:13: warning: suggest parentheses around comparison in operand of '|' [-Wparentheses]
   return (g < A | g > B)?MAXLOG:MINLOG;
             ^
sculpture.cpp: In function 'int main()':
sculpture.cpp:58:17: warning: format '%d' expects argument of type 'int*', but argument 2 has type 'll* {aka long long int*}' [-Wformat=]
   scanf("%d", &x), v[i] = v[i-1] + x;
                 ^
sculpture.cpp:56:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %d", &N, &A, &B);
                               ^
sculpture.cpp:58:37: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &x), v[i] = v[i-1] + x;
                                     ^
#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...