Submission #316713

#TimeUsernameProblemLanguageResultExecution timeMemory
316713nandonathanielBali Sculptures (APIO15_sculpture)C++14
100 / 100
101 ms640 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2005,INF=1e9;
bool dp[MAXN][MAXN];
int dp2[MAXN],n,a,b;
long long pref[MAXN],ans;

bool submask(long long mask){
	return ((mask|ans)==ans);
}

long long get(int l,int r){
	return pref[r]-pref[l-1];
}

bool can(){  //bisa ga or dari sumnya, submask dari ans
	if(n<=100){
		dp[0][0]=true;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=i;j++){
				dp[i][j]=false;
				for(int k=0;k<i;k++){
					if(dp[k][j-1] && submask(get(k+1,i)))dp[i][j]=true;
				}
			}
		}
		for(int i=a;i<=b;i++){
			if(dp[n][i])return true;
		}
		return false;
	}
	else{  //minimum partition
		dp2[0]=0;
		for(int i=1;i<=n;i++){
			dp2[i]=INF;
			for(int j=0;j<i;j++){
				if(submask(get(j+1,i)))dp2[i]=min(dp2[i],dp2[j]+1);
			}
		}
		return dp2[n]<=b;
	}
}

int main(){
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin >> n >> a >> b;
	for(int i=1;i<=n;i++){
		int x;cin >> x;
		pref[i]=pref[i-1]+x;
	}
	ans=(1LL<<41)-1;
	for(int i=40;i>=0;i--){
		//iterate dari MSB,karena 2^0+2^1+...+2^(x-1)=2^x-1
		ans^=(1LL<<i);
		if(!can())ans^=(1LL<<i);
	}
	cout << ans << '\n';
	return 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...