답안 #25485

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
25485 2017-06-22T12:01:28 Z gabrielsimoes Bali Sculptures (APIO15_sculpture) C++14
0 / 100
0 ms 9860 KB
#include <bits/stdc++.h>
using namespace std;
 
typedef signed char sc;
typedef long long ll;
#define most(a) (sc(63 - __builtin_clzll(a)))
 
const int MAXN = 2001;
const sc MINLOG = -1;
const sc MAXLOG = 44;
 
int N, A, B;
ll v[MAXN];
 
ll x;
bool ok[MAXN][MAXN];
sc dp[MAXN][MAXN];
 
sc cost(int i, int j) {
	ll a = (v[j] - v[i-1])&(~x);
	if (a != 0) return most(a);
	else return MINLOG;
}
 
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];
sc dpa1[MAXN];
sc fa1(int i) {
	if (i > N) return MINLOG;
	if (oka1[i]) return dpa1[i];
	oka1[i] = 1;
 
	dpa1[i] = MAXLOG;
	for (int j = i; j <= N; j++)
		dpa1[i] = min(dpa1[i], max(cost(i, j), 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;
 
	x = 0;
	sc lim = most(v[N]) + 1;
	while (lim > 0) {
		if (A != 1) memset(ok, 0, sizeof(ok));
		else memset(oka1, 0, sizeof(oka1));
		
		lim = A != 1 ? f(1, 0) : fa1(1);
 
		if (lim != MINLOG)
			x |= (1LL << lim);
	}
 
	printf("%lld\n", x);
}

Compilation message

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:57: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:55: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:57: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;
                                     ^
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 9860 KB Output is correct
2 Correct 0 ms 9860 KB Output is correct
3 Correct 0 ms 9860 KB Output is correct
4 Correct 0 ms 9860 KB Output is correct
5 Incorrect 0 ms 9860 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 9860 KB Output is correct
2 Correct 0 ms 9860 KB Output is correct
3 Correct 0 ms 9860 KB Output is correct
4 Correct 0 ms 9860 KB Output is correct
5 Incorrect 0 ms 9860 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 9860 KB Output is correct
2 Correct 0 ms 9860 KB Output is correct
3 Correct 0 ms 9860 KB Output is correct
4 Correct 0 ms 9860 KB Output is correct
5 Incorrect 0 ms 9860 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 9860 KB Output is correct
2 Correct 0 ms 9860 KB Output is correct
3 Correct 0 ms 9860 KB Output is correct
4 Correct 0 ms 9860 KB Output is correct
5 Incorrect 0 ms 9860 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 9860 KB Output is correct
2 Correct 0 ms 9860 KB Output is correct
3 Correct 0 ms 9860 KB Output is correct
4 Correct 0 ms 9860 KB Output is correct
5 Incorrect 0 ms 9860 KB Output isn't correct
6 Halted 0 ms 0 KB -