Submission #1165359

#TimeUsernameProblemLanguageResultExecution timeMemory
1165359mysticmage45Bali Sculptures (APIO15_sculpture)C++20
21 / 100
3 ms332 KiB
#include<bits/stdc++.h>
using namespace std;

#define ll long long
const ll bitsize = 30;

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

    ll n, a, b;
    cin >> n >> a >> b;

    ll year[n+5];
    for(ll i = 1; i <= n; i++){
        cin >> year[i];
    }

    if(a == 1){
        ll sumyear[n+5][n+5];
        for(ll l = 1; l <= n; ++l){
            ll sumnow = 0;
            for(ll r = l; r <= n; ++r){
                sumnow += year[r];
                sumyear[l][r] = sumnow;
            }
        }

        ll ans = 0;
        for(ll digit = bitsize; digit >= 0; digit--){
            //test if the i th digit in ans can be 1
            ll dp[n+5];
            dp[0] = 0;
            for(ll i = 1; i <= n; i++) dp[i] = 1e18;
            
            for(ll i = 0; i <= n; i++){
                for(ll j = i+1; j <= n; j++){
                    bool pass = 1;
                    ll thissum = sumyear[i+1][j];
                    //cout << i+1 <<  " " << j << " " << thissum << "\n";                    
                    for(ll k = digit+1; k <= bitsize; k++){
                        //if(digit == 3) cout << i << " " << j << " " << k << " : " << thissum << " " << (thissum>>k&1) << " " << (ans>>k&1) << "\n";
                        if(((thissum>>k&1) == 1) && ((ans>>k&1) == 0)){
                            //cout << " lsd lf\n";
                            pass = 0;
                        }
                    }

                    if(thissum>>digit&1 == 1){
                        pass = 0;
                    }

                    if(pass){
                        //cout << digit << " : " << i << " " << j << "\n";
                        dp[j] = min(dp[j], dp[i]+1);
                    }
                }
            }

            if(dp[n] > b){
                ans += 1<<digit;
            }

            /*cout << "digit = " << digit << " : ";
            for(ll i = 0; i <= n; i++){
                cout << dp[i] << " ";
            }
            cout << "\n";
            cout << "test : ";
            for(ll i = 18; i >= 0; i--){
                cout << (17>>i&1);
            }
            cout << "\n";*/
            
        }

        cout << ans << "\n";
    }
    else{
        ll sumyear[n+5][n+5];
        for(ll l = 1; l <= n; ++l){
            ll sumnow = 0;
            for(ll r = l; r <= n; ++r){
                sumnow += year[r];
                sumyear[l][r] = sumnow;
            }
        }

        ll ans = 0;
        for(ll digit = bitsize; digit >= 0; digit--){
            //test if the i th digit in ans can be 1
            ll dp[n+5][n+5];
            for(ll i = 0; i <= n; i++) for(ll j = 0; j <= n; j++) dp[i][j] = 1e18;
            dp[0][0] = 0;
            
            for(ll i = 0; i <= n; i++){
                for(ll j = i+1; j <= n; j++){
                    bool pass = 1;
                    ll thissum = sumyear[i+1][j];

                    for(ll k = digit+1; k <= bitsize; k++){
                        if(((thissum>>k&1) == 1) && ((ans>>k&1) == 0)){
                            pass = 0;
                        }
                    }

                    if(thissum>>digit&1 == 1){
                        pass = 0;
                    }

                    if(pass){
                        //cout << digit << " : " << i << " " << j << "\n";
                        for(ll k = 0; k < n; k++) dp[j][k+1] = min(dp[j][k+1], dp[i][k]);
                    }
                }
            }

            for(ll k = a; k <= b; k++){
                if(dp[n][k] != 0){
                    //cout << digit << " " << k << "\n";
                    ans += (1<<digit);
                    break;
                }
            }
        }

        cout << ans << "\n";
    }
}

/*

6 1 3
8 1 2 1 5 4


6 2 3
8 1 2 1 5 4

*/
#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...