This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |