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;
const int _N=2010;
int a[_N], n, l, r, pf[_N];
namespace sub5{
const int N=2010;
bool adj[N][N];
int f[N];
bool check(int msk){
for (int i=0; i<=n; ++i) for (int j=i+1; j<=n; ++j) adj[i][j]=((pf[j]-pf[i])&msk)==0;
memset(f, 0x3f, sizeof f);
f[0]=0;
for (int i=0; i<n; ++i) for (int j=i+1; j<=n; ++j) if (adj[i][j]){
f[j]=min(f[j], f[i]+1);
}
return f[n]<=r;
}
void solve(){
int msk=(1<<30)-1;
for (int i=29; i>=0; --i){
if (check((1<<30)-1-(msk^(1<<i)))) msk^=1<<i;
}
cout << msk << '\n';
}
}
namespace sub4{
const int N=110;
bool adj[N][N];
bool f[N][N];
bool check(int msk){
for (int i=0; i<=n; ++i) for (int j=i+1; j<=n; ++j) adj[i][j]=((pf[j]-pf[i])&msk)==0;
memset(f, 0, sizeof f);
f[0][0]=1;
for (int i=0; i<n; ++i) for (int j=i+1; j<=n; ++j) if (adj[i][j]){
for (int k=0; k<n; ++k) f[j][k+1]|=f[i][k];
}
return *max_element(f[n]+l, f[n]+r+1);
}
void solve(){
int msk=(1<<30)-1;
for (int i=29; i>=0; --i){
if (check((1<<30)-1-(msk^(1<<i)))) msk^=1<<i;
}
cout << msk << '\n';
}
}
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> l >> r;
for (int i=1; i<=n; ++i) cin >> a[i];
partial_sum(a, a+n+1, pf);
if (n<=100) sub4::solve();
else sub5::solve();
return 0;
}
# | 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... |