Submission #162237

#TimeUsernameProblemLanguageResultExecution timeMemory
162237rama_pangBali Sculptures (APIO15_sculpture)C++14
71 / 100
1061 ms504 KiB
#include <bits/stdc++.h>
using namespace std;
using lint = long long;

int N, L, R;
vector<lint> A;
vector<lint> prefix_sum;
vector<vector<int8_t>> DP;

inline lint get(int l, int r) {
    return prefix_sum[r] - ((l > 0)? prefix_sum[l - 1] : 0);
}

int8_t dp(int n, int groups, lint mask) {
    if (n == N) 
        return (L <= groups && groups <= R);
    if (n > N)
        return false;
    if (groups > R)
        return false;
    if (DP[n][groups] != -1)
        return DP[n][groups];
    
    int8_t &res = DP[n][groups];
    res = 0;

    for (int i = n; i < N; i++) 
        if ((get(n, i) | mask) == mask) 
            res |= dp(i + 1, groups + 1, mask);
    
    return res;
}

int8_t solve(lint mask) { // Check if it is possible to get beauty of a subset of mask
    DP.assign(N, vector<int8_t>(R, -1));
    return dp(0, 0, mask);
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> N >> L >> R;

    A.reserve(N), A.resize(N);
    prefix_sum.reserve(N), prefix_sum.resize(N);

    for (int i = 0; i < N; i++) {
        cin >> A[i];
        prefix_sum[i] = ((i > 0)? prefix_sum[i - 1] : 0) + A[i];
    }
    
    lint ans = (1ll << 62ll) - 1;
    for (lint bit = 61; bit >= 0; bit--) 
        if (solve(ans - (1ll << bit)) == 1) 
            ans -= (1ll << bit);
    
    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...