Submission #1262686

#TimeUsernameProblemLanguageResultExecution timeMemory
1262686tormentBali Sculptures (APIO15_sculpture)C++20
100 / 100
74 ms584 KiB
#include<bits/stdc++.h>
using namespace std;
// https://codeforces.com/blog/entry/17717?#comment-227370
const int N = 2005;
const int LOG = 44;
const int inf = 1e9;
int a[N];
bool dp[N][N];
int dp2[N];
bool check2(long long S, int n, int B){
    for(int i = 0;i <= n + 1;++i){
        dp2[i] = inf;
    }
    dp2[n + 1] = 0;
    for(int i = n;i >= 1;--i){
        long long sum = 0;
        for(int j = i;j <= n;++j){
            sum += a[j];
            if((sum & S) == sum){
                dp2[i] = min(dp2[i], dp2[j + 1] + 1);
            }
        }
    } 
    return dp2[1] <= B;
}
bool check(long long S, int n, int A, int B){
    if(A == 1)return check2(S, n, B);
    for(int i = 1;i <= n + 1;++i){
        for(int j = 0;j <= n;++j){
            dp[i][j] = false;
        }
    }
    for(int i = A;i <= B;++i){
        dp[n + 1][i] = true;
    }
    for(int i = n;i >= 1;--i){
        for(int j = 0;j <= n;++j){
            long long sum = 0;
            for(int ii = i;ii <= n;++ii){
                sum += a[ii];
                if((sum & S) == sum){
                    dp[i][j] = (dp[i][j] | dp[ii + 1][j + 1]);
                }
            }
        }
    }
    return dp[1][0];
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, A, B;
    cin >> n >> A >> B;
    for(int i = 1;i <= n;++i){
        cin >> a[i];
    }
    long long ans = (1ll << LOG) - 1;
    for(int i = LOG - 1;i >= 0;--i){
        if(check(ans - (1ll << i), n, A, B)){
            ans -= (1ll << i);
        }
    }
    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...