This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// 4
// :(
#ifndef LOCAL
#define NDEBUG 1
#endif
#include<bits/stdc++.h>
int main(){
std::ios::sync_with_stdio(0);std::cin.tie(0);
int number, least, most; std::cin>>number>>least>>most;
std::vector<int64_t> sum(number+1);
for(auto [index, last]=std::pair(1,(int64_t)0); index<=number; ++index){
int value; std::cin>>value;
sum[index]=last+=value;
}
auto const check=[&](int64_t const mask){
if(least!=1){
std::vector<std::vector<char>> f(number+1, std::vector<char>(most+1));
f[0][0]=true;
for(int index=0; index<number; ++index)
for(int next=index+1; next<=number; ++next)
if(((~ mask)&(sum[next]-sum[index]))==0){
for(int numComponent=0; numComponent<most; ++numComponent)
if(f[index][numComponent]) f[next][numComponent+1]=true;
}
return std::any_of(f.back().begin()+least, f.back().end(),[&](auto it){return it;});
}else{
std::vector<int> least(number+1, INT_MAX);
least[0]=0;
for(int index=0; index<number; ++index) if(auto const curNumber=least[index]; curNumber<most)
for(int next=index+1; next<=number; ++next)
if(((~ mask)&(sum[next]-sum[index]))==0){
least[next]=std::min(least[next], curNumber+1);
}
return least.back()<=most;
}
};
int const numBit=1+(63^__builtin_clzll(sum.back()));
int64_t value=((int64_t)1<<numBit)-1;
for(int bit=numBit; bit--;){
if(check(value-((int64_t)1<<bit))) value-=(int64_t)1<<bit;
}
std::cout<<value<<'\n';
}
# | 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... |