Submission #812544

#TimeUsernameProblemLanguageResultExecution timeMemory
812544BelphegorBali Sculptures (APIO15_sculpture)C++14
100 / 100
112 ms344 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll u = 1;
int n,a,b;
ll A[2005];
int dp[2005];
bitset<101>DP[105];

bool pos(ll mask){
	for(int i=1; i<=n; i++){
		dp[i] = 1e8;
		for(int j=0; j<i; j++){
			ll w = A[i] - A[j];
			if((w&mask) == w) dp[i] = min(dp[i],1 + dp[j]);
		}
	}
	return (dp[n] <= b);
}
bool pos2(ll mask){
	for(int i=0; i<=n; i++) DP[i].reset();
	DP[0][0] = 1;
	for(int i=1; i<=n; i++){
		for(int j=0; j<i; j++){
			ll w = A[i] - A[j];
			if((w&mask) == w) DP[i]|=(DP[j]<<1);
		}
	}
	for(int i=a; i<=b; i++) if(DP[n][i]) return 1;
	return 0;
}
int main(){
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    cin>>n>>a>>b;
    for(int i=1; i<=n; i++) cin>>A[i];
    for(int i=1; i<=n; i++) A[i]+=A[i-1];
    if(!A[n]){
    	cout<<0;
    	return 0;
	}
    if(a > 1){
    	assert(n<=100);
    	int last_digit = 41;
    	while(pos2( (u<<(last_digit+1)) - 1 )) last_digit--;
		last_digit++;
		ll mask = (u<<last_digit)*2 - 1;
		for(int i=last_digit-1; i>=0; i--){
			mask^=(u<<i);
			if(pos2(mask)) continue;
			else mask^=(u<<i);
		}
		cout<<mask;
	}
	else{
		int last_digit = 41;
		while(pos( (u<<(last_digit+1)) - 1 )) last_digit--;
		last_digit++;
		ll mask = (u<<last_digit)*2 - 1;
		for(int i=last_digit-1; i>=0; i--){
			mask^=(u<<i);
			if(pos(mask)) continue;
			else mask^=(u<<i);
		}
		cout<<mask;
	}
}
#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...