Submission #256088

#TimeUsernameProblemLanguageResultExecution timeMemory
256088fedoseevtimofeyBali Sculptures (APIO15_sculpture)C++14
100 / 100
124 ms512 KiB
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <random>
#include <iomanip>
#include <functional>
#include <cassert>
 
using namespace std;
 
typedef long long ll;
 
int main() {
  ios_base::sync_with_stdio(false); cin.tie(0);
#ifdef LOCAL
  freopen("input.txt", "r", stdin);
#endif
  int n, a, b;
  cin >> n >> a >> b;
  vector <int> v(n);
  for (int i = 0; i < n; ++i) cin >> v[i];
  vector <ll> pref(n + 1);
  for (int i = 0; i < n; ++i) {
    pref[i + 1] = pref[i] + v[i];
  }

  auto get = [&] (int l, int r) {
    return pref[r + 1] - pref[l];
  };

  if (n <= 200) {
    auto can = [&] (ll mask) {
      vector <vector <int>> dp(n + 1, vector <int> (n + 1));
      dp[0][0] = 1; 
      for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
          for (int k = i; k < n; ++k) {
            ll sm = get(i, k);
            if ((sm & mask) == 0) {
              dp[k + 1][j + 1] |= dp[i][j];
            }
          }
        }
      }
      bool ok = false;
      for (int x = a; x <= b; ++x) {
        ok |= dp[n][x];
      }
      return ok;
    };
    ll mask = 0;
    ll ans = 0;
    for (int b = 60; b >= 0; --b) {
      if (can(mask + (1LL << b))) {
        mask += (1LL << b);
      } else {
        ans += (1LL << b);
      }
    }
    cout << ans << '\n';
  } else {
    auto can = [&] (ll mask) {
      vector <int> dp(n + 1, (int)1e9);
      dp[0] = 0;
      for (int i = 0; i < n; ++i) {
        for (int j = i; j < n; ++j) {
          ll sm = get(i, j);
          if ((sm & mask) == 0) {
            dp[j + 1] = min(dp[j + 1], dp[i] + 1);
          }
        }
      }
      return (dp[n] <= b);
    };
    ll mask = 0;
    ll ans = 0;
    for (int b = 60; b >= 0; --b) {
      if (can(mask + (1LL << b))) {
        mask += (1LL << b);
      } else {
        ans += (1LL << b);
      }
    }
    cout << ans << '\n';

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