Submission #337156

#TimeUsernameProblemLanguageResultExecution timeMemory
337156danielcm585Bali Sculptures (APIO15_sculpture)C++14
100 / 100
140 ms4460 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N = 2e3;
const int LOG = 45;
const int INF = 1e9;
const ll MX = 1e18;
int n, a, b;
int y[N+2], dp[N+2];
bool dp2[N+2][N+2];

bool can(ll x) {
    dp[0] = 0;
    for (int i = 1; i <= n; i++) {
        dp[i] = INF;
        ll sum = 0;
        for (int j = i; j >= 1; j--) {
            sum += y[j];
            if ((sum|x) == x) dp[i] = min(dp[i],dp[j-1]+1);
        }
    }
    return dp[n] <= b;
}

bool can2(ll x) {
    // dp2[i][j] -> apakah bisa di idx i, byk kelompok tepat j
    memset(dp2,0,sizeof(dp2));
    dp2[0][0] = 1;
    for (int i = 1; i <= n; i++) {
        ll sum = 0;
        for (int k = i; k >= 1; k--) {
            sum += y[k];
            for (int j = 1; j <= b; j++) {
                if ((sum|x) == x) dp2[i][j] |= dp2[k-1][j-1];
            }
        }
    }
    for (int i = a; i <= b; i++) {
        if (dp2[n][i]) return 1;
    }
    return 0;
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> a >> b;
    for (int i = 1; i <= n; i++) {
        cin >> y[i];
    }
    ll ans = (1ll<<(LOG+1))-1;
    if (a == 1) {
        // 0010011111111
        for (int i = LOG; i >= 0; i--) {
            if (can(ans^(1ll<<i))) ans ^= (1ll<<i);
        }
    }
    else {
        for (int i = LOG; i >= 0; i--) {
            if (can2(ans^(1ll<<i))) ans ^= (1ll<<i);
        }
    }
    cout << 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...