Submission #371157

#TimeUsernameProblemLanguageResultExecution timeMemory
371157FystyBali Sculptures (APIO15_sculpture)C++17
100 / 100
125 ms512 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
#define rep(i,n) for(ll i=0;i<n;i++)
#define rep1(i,n) for(ll i=1;i<=n;i++)
#define F first
#define S second
#define pb push_back
const int INF=1e9;
ll sum[2005],a[2005];
const ll maxN=1LL<<41;
int main()
{
    ll n,A,B;
    cin>>n>>A>>B;
    rep1(i,n) cin>>a[i];
    rep1(i,n) sum[i]=sum[i-1]+a[i];
    ll ans=maxN-1;
    if(A>1)
    {
        for(int t=40;t>=0;t--)
        {
            ll tmp=ans^(1LL<<t);
            vector<vector<bool> > dp(n+1,vector<bool>(n+1,0));
            dp[0][0]=1;
            rep1(i,n)
            {
                rep1(j,min(i,B))
                {
                    for(int k=i-1;k>=0;k--)
                    {
                        if(dp[k][j-1]&&((sum[i]-sum[k])|tmp)<=tmp)
                        {
                            dp[i][j]=1;
                            break;
                        }
                    }
                }
            }
            bool x=0;
            for(int i=A;i<=B;i++) if(dp[n][i]) x=1;
            if(x) ans=tmp;
        }
    }
    else
    {
        for(int t=40;t>=0;t--)
        {
            ll tmp=ans^(1LL<<t);
            vector<ll> dp(n+1,0);
            rep1(i,n)
            {
                dp[i]=INF;
                for(int j=i-1;j>=0;j--)
                {
                    if(dp[j]+1<dp[i]&&((sum[i]-sum[j])|tmp)<=tmp) dp[i]=dp[j]+1;
                }
            }
            if(dp[n]<=B) ans=tmp;
        }
    }
    cout<<ans;
}
#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...