Submission #1179064

#TimeUsernameProblemLanguageResultExecution timeMemory
1179064alexander707070Bali Sculptures (APIO15_sculpture)C++20
71 / 100
1095 ms472 KiB
#include<bits/stdc++.h>
#define MAXN 2007
using namespace std;

int n,L,R;
int a[MAXN];
long long pref[MAXN];
long long ans;

int dp[MAXN];
bool dp2[107][107];

bool ok(long long x,int bit){
	for(int i=60;i>=bit;i--){
		if(((1LL<<i)&x)>0 and ((1LL<<i)&ans)==0)return false;
	}

	return true;
}

void calcdp(int bit){
	for(int i=1;i<=n;i++){
		dp[i]=2*n;

		for(int f=i;f>=1;f--){
			if(ok(pref[i]-pref[f-1],bit))dp[i]=min(dp[i],dp[f-1]+1);
		}
	}
}

void calcdp2(int bit){
	dp2[0][0]=true;
	for(int i=1;i<=R;i++)dp2[0][i]=false;

	for(int i=1;i<=n;i++){
		for(int k=1;k<=R;k++){
			dp2[i][k]=false;

			for(int f=i;f>=1;f--){
				if(ok(pref[i]-pref[f-1],bit) and dp2[f-1][k-1])dp2[i][k]=true;
			}
		}
	}
}

void solve1(){
	for(int i=60;i>=0;i--){
		calcdp(i);
		if(dp[n]>R)ans|=(1LL<<i);
	}

	cout<<ans<<"\n";
}

void solve2(){
	for(int i=60;i>=0;i--){
		calcdp2(i);

		for(int f=L;f<=R;f++){
			if(dp2[n][f])break;
			else if(f==R)ans|=(1LL<<i);
		}
	}

	cout<<ans<<"\n";
}

int main(){

	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin>>n>>L>>R;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		pref[i]=pref[i-1]+a[i];
	}

	if(L==1){
		solve1();
	}else{
		solve2();
	}

	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...