Submission #260968

#TimeUsernameProblemLanguageResultExecution timeMemory
260968user202729Bali Sculptures (APIO15_sculpture)C++17
37 / 100
1 ms512 KiB
// 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-(1<<bit))) value-=1<<bit;
	}
	std::cout<<value<<'\n';
}
#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...