Submission #154249

#TimeUsernameProblemLanguageResultExecution timeMemory
154249nthoangBali Sculptures (APIO15_sculpture)C++17
100 / 100
138 ms504 KiB
#include <bits/stdc++.h>

#ifdef LOCAL
#include "/Users/nth842002/Library/debug.h"
#endif

using namespace std;

const int N = 2222;
const int LOG = 45;
const int INF = (int) 1e9 + 7;

int n, A, B;
long long a[N];
long long p2[LOG + 10];
long long prefix;

inline bool Check(long long sum) {
  sum = p2[LOG] - 1 - sum;
  return (sum & prefix) == prefix;
}

void Solve1() {
  long long ans = 0;
  for (int bits = LOG - 1; bits >= 0; bits--) {
    prefix += p2[bits];
    vector<int> f(n + 1, INF);
    f[0] = 0;
    for (int i = 0; i < n; i++) {
      if (f[i] == INF) {
        continue;
      }
      for (int j = i; j < n; j++) {
        if (Check(a[j] - (i == 0 ? 0 : a[i - 1]))) {
          f[j + 1] = min(f[j + 1], f[i] + 1);
        }
      }
    }
    if (f[n] > B) {
      prefix -= p2[bits];
      ans += p2[bits];
    }
  }
  cout << ans << '\n';
}

void Solve2() {
  long long ans = 0;
  for (int bits = LOG - 1; bits >= 0; bits--) {
    prefix += p2[bits];
    vector<vector<bool>> f(n + 1, vector<bool>(n + 1));
    f[0][0] = true;
    for (int i = 0; i < n; i++) {
      for (int k = 0; k < B; k++) {
        if (!f[i][k]) {
          continue;
        }
        for (int j = i; j < n; j++) {
          if (Check(a[j] - (i == 0 ? 0 : a[i - 1]))) {
            f[j + 1][k + 1] = true;
          }
        }
      }
    }
    bool exist = false;
    for (int k = A; k <= B; k++) {
      if (f[n][k]) {
        exist = true;
        break;
      }
    }
    if (not exist) {
      prefix -= p2[bits];
      ans += p2[bits];
    }
  }
  cout << ans << '\n';
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> A >> B;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    a[i] += a[i - 1];
  }
  p2[0] = 1;
  for (int i = 1; i <= LOG; i++) {
    p2[i] = p2[i - 1] + p2[i - 1];
  }
  if (A == 1) {
    Solve1();
  } else {
    Solve2();
  }
  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...