Submission #160903

#TimeUsernameProblemLanguageResultExecution timeMemory
160903nvmdavaBali Sculptures (APIO15_sculpture)C++17
100 / 100
151 ms760 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ff first
#define ss second
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define N 2005
#define INF 0x3f3f3f3f3f3f3f3f
#define MOD 1000000007LL
ll p[N];
int dp1[N];
bool dp[505][505];
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

	int n, a, b;
	cin>>n>>a>>b;

	ll res = 0;

	for(int i = 1; i <= n; i++){
		cin>>p[i];
		p[i] += p[i - 1];
	}    
	for(ll k = 45; k >= 0; k--){
		if(a == 1){
			memset(dp1, 0x3f, sizeof dp1);
			dp1[0] = 0;
		} else {
			memset(dp, 0, sizeof dp);
			dp[0][0] = 1;
		}
		for(int i = 1; i <= n; i++){
			for(int j = 1; j <= i; j++){
				if( (((p[i] - p[j - 1]) >> k ) | (res >> k)) != (res >> k) )
					continue;
				if(a == 1){
					dp1[i] = min(dp1[i], dp1[j - 1] + 1);
				} else {
					for(int l = 0; l < j; l++){
						if(dp[j - 1][l]){
							dp[i][l + 1] = 1;
						}
					}
				}
			}
		}
		if(a == 1){
			if(dp1[n] > b)
				res += 1LL << k;
		} else {
			res += 1LL << k;
			for(int j = a; j <= b; j++){
				if(dp[n][j]){
					res -= 1LL << k;
					break;
				}
			}
		}
	}
	cout<<res;
}
#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...