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...