Submission #1244232

#TimeUsernameProblemLanguageResultExecution timeMemory
1244232wedonttalkanymoreBali Sculptures (APIO15_sculpture)C++20
100 / 100
180 ms31884 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

#define int long long
#define pii pair<ll, ll>
#define fi first
#define se second

const ll N = 2e3 + 5, inf = 1e18, mod = 1e9 + 7, block = 320, lim = 41;

int n, l, r;
int a[N];
int dp[N][N];
int f[N]; // so nhom nho nhat tinh den i ma moi nhom deu co sum thuoc res

void reset() {
    for (int i = 0; i <= n; i++) {
        f[i] = inf;
        for (int j = 0; j <= n; j++) dp[i][j] = false;
    }
    f[0] = 0;
    // cout << "ok: " << flush;
    dp[0][0] = true;
}
void sub4() {
    // cout << 11111 << '\n' << flush;
     // xet den i va da dung j doan
    int res = (1LL << lim) - 1;
    // cout << res;
    for (int mask = lim - 1; mask >= 0; mask--) {
        reset();
        res -= (1LL << mask);
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= i; j++) {
                if (!dp[i][j]) continue;
                int sum = 0;
                for (int k = i + 1; k <= n; k++) {
                    sum += a[k];
                    if ((sum & res) == sum) { // sum la con cua res
                        dp[k][j + 1] = true;
                    }
                }
            }
        }
        int need = 0;
        for (int i = l; i <= r; i++) need |= dp[n][i];
        res += !need * (1LL << mask);
    }
    cout << res << '\n';
}

void subfull() {
    int res = (1LL << lim) - 1;
    for (int mask = lim - 1; mask >= 0; mask--) {
        reset();
        res -= (1LL << mask);
        for (int i = 0; i < n; i++) {
            int sum = 0;
            for (int j = i + 1; j <= n; j++) {
                sum += a[j];
                if ((sum & res) == sum) f[j] = min(f[j], f[i] + 1);
            }
        }
        if (f[n] > r) res += (1LL << mask);
    }
    cout << res << '\n';
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> l >> r;
    for (int i = 1; i <= n; i++) cin >> a[i];
    // cout << n << ' ' << l << ' ' << r << '\n';
    if (n <= 100) {
        // cout << 111 << '\n' << flush;
        sub4();
    }
    else subfull();
    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...