Submission #463814

#TimeUsernameProblemLanguageResultExecution timeMemory
463814MohamedAhmed04Bali Sculptures (APIO15_sculpture)C++14
100 / 100
235 ms16072 KiB
#include <bits/stdc++.h>

using namespace std ;

const int MAX = 2004 ;

int arr[MAX] ;
int n , a , b ;

long long mask , ans ;

int dp[MAX][MAX] ;

int solve(int idx , int groups)
{
	if(groups > b)
		return 0 ;
	if(idx == n)
		return (groups >= a && groups <= b) ;
	int &ret = dp[idx][groups] ;
	if(ret != -1)
		return ret ;
	ret = 0 ;
	long long sum = 0 ;
	for(int i = idx ; i < n ; ++i)
	{
		sum += arr[i] ;
		if((sum & mask))
			continue ;
		ret |= solve(i+1 , groups+1) ;
	}
	return ret ;
}

bool check1()
{
	memset(dp , -1 , sizeof(dp)) ;
	return (solve(0 , 0) == 1) ;
}

void calc1()
{
	for(int bit = 50 ; bit >= 0 ; --bit)
	{
		mask |= (1ll << bit) ;
		if(!check1())
			mask ^= (1ll << bit) , ans += (1ll << bit) ;
	}
}

int dp2[MAX] ;

int solve2(int idx)
{
	if(idx == n)
		return 0 ;
	int &ret = dp2[idx] ;
	if(ret != -1)
		return ret ;
	ret = 1e9 ;
	long long sum = 0 ;
	for(int i = idx ; i < n ; ++i)
	{
		sum += arr[i] ;
		if((sum & mask))
			continue ;
		ret = min(ret , solve2(i+1) + 1) ;
	}
	return ret ;
}

bool check2()
{
	memset(dp2 , -1 , sizeof(dp2)) ;
	return (solve2(0) <= b) ;
}

void calc2()
{
	for(int bit = 50 ; bit >= 0 ; --bit)
	{
		mask |= (1ll << bit) ;
		if(!check2())
			mask ^= (1ll << bit) , ans += (1ll << bit) ;
	}	
}

int main()
{
	ios_base::sync_with_stdio(0) ;
	cin.tie(0) ;
	cin>>n>>a>>b ;
	for(int i = 0 ; i < n ; ++i)
		cin>>arr[i] ;
	if(a > 1)
		calc1() ;
	else
		calc2() ;
	return cout<<ans<<"\n" , 0 ;
}
#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...