Submission #1167717

#TimeUsernameProblemLanguageResultExecution timeMemory
1167717JelalTkmBali Sculptures (APIO15_sculpture)C++20
37 / 100
1 ms328 KiB
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")

using namespace std;

#define int long long int

const int N = 1e5 + 10;
const int md = 1e9 + 7;
const int INF = 1e9;

int32_t main(int32_t argc, char *argv[]) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int T = 1;
  // cin >> T;
  while (T--) {
    int n, a, b;
    cin >> n >> a >> b;
    if (a != 1) {
      vector<int> v(n + 1), pref(n + 1);
      for (int i = 1; i <= n; i++) {
        cin >> v[i];
        pref[i] = pref[i - 1] + v[i];
      }
      int msk = (1ll << 45ll) - 1ll;
      // cout << msk << '\n';
      int t_ans = 0;
      for (int m = 45; m >= 0; m--) {
        vector<vector<int>> dp(n + 1, vector<int> (b + 1));
        dp[0][0] = 1;
        int ans = 0;
        for (int i = 1; i <= n; i++) {
          for (int k = 1; k <= b; k++) {
            for (int j = i - 1; j >= 0; j--) {
              int sm = (pref[i] - pref[j]);
              if ((sm | msk) == msk)
                dp[i][k] |= dp[j][k - 1];
            }
            if (i == n && dp[i][k] > 0)
              ans = max(ans, k);
          }
        }
        if (ans < a) {
          msk |= (1 << m);
          t_ans |= (1 << m);
        }
        if (m != 0)
        msk ^= (1 << (m - 1));
      }
      
      cout << t_ans << '\n';
    } else {
      vector<int> v(n + 1), pref(n + 1);
      for (int i = 1; i <= n; i++) {
        cin >> v[i];
        pref[i] = pref[i - 1] + v[i];
      }
      int msk = (1ll << 45ll) - 1ll;
      // cout << msk << '\n';
      int t_ans = 0;
      for (int m = 45; m >= 0; m--) {
        vector<int> dp(n + 1, INF);
        dp[0] = 0;
        int ans = 0;
        for (int i = 1; i <= n; i++) {
          for (int j = i - 1; j >= 0; j--) {
            int sm = (pref[i] - pref[j]);
            if ((sm | msk) == msk)
              dp[i] = min(dp[i], dp[j] + 1);
          }
        }
        if (dp[n] < a || dp[n] > b) {
          msk |= (1 << m);
          t_ans |= (1 << m);
        }
        if (m != 0)
        msk ^= (1 << (m - 1));
      }
      
      cout << t_ans << '\n';
    }
  }

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