제출 #45939

#제출 시각아이디문제언어결과실행 시간메모리
45939Just_Solve_The_ProblemBali Sculptures (APIO15_sculpture)C++11
100 / 100
190 ms16508 KiB
#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define eb emplace_back
#define ll long long
#define pii pair < int, int >
#define fr first
#define sc second
#define mk make_pair
#define sz(s) (int)s.size()
#define all(s) s.begin(), s.end()
#define ok puts("ok");
#define whatis(x) cerr << #x << " = " << x << endl;
#define pause system("pause");

const int N = (int)2e3 + 7;
const int inf = (int)1e9 + 7;

int ar[N];
int dp[N];
int dpp[N][N];
int n, a, b;
ll pref[N];
ll ans;

ll get(int l, int r) {
  return pref[r] - pref[l - 1];
}

bool check1(ll x) {
  for (int i = 1; i <= n; i++) {
    dp[i] = inf;
    for (int j = i; j >= 1; j--) {
      if ((x | get(j, i)) == x) {
        dp[i] = min(dp[i], dp[j - 1] + 1);
      }
    }
  }
  return dp[n] <= b;
}

bool check(int x) {
  memset(dpp, 0, sizeof dpp);
  dpp[0][0] = 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      for (int k = j; k >= 1; k--) {
        if ((ans | ((get(k, j) >> x) << x)) == ans) {
          dpp[i][j] |= dpp[i - 1][k - 1];
        }
      }
    }
  }
  for (int i = a; i <= b; i++) {
    if (dpp[i][n]) return 1;
  }
  return 0;
}

main() {
  scanf("%d %d %d", &n, &a, &b);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &ar[i]);
    pref[i] = pref[i - 1] + ar[i];
  }
  if (a == 1) {
    for (int i = 40; i >= 0; i--) {
      if (!check1(ans + (1LL << i) - 1)) {
        ans += (1LL << i);
      }
    }
  } else {
    for (int k = 40; k >= 0; k--) {
      if (!check(k)) {
        ans += (1LL << k);
      }
    }
  }
  printf("%lld", ans);
}

컴파일 시 표준 에러 (stderr) 메시지

sculpture.cpp:62:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main() {
      ^
sculpture.cpp: In function 'int main()':
sculpture.cpp:63:8: 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:65:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &ar[i]);
     ~~~~~^~~~~~~~~~~~~~
#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...