제출 #237587

#제출 시각아이디문제언어결과실행 시간메모리
237587wwddBali Sculptures (APIO15_sculpture)C++14
100 / 100
83 ms512 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MB = 42;
const int MN = 2020;
const int NN = 102;
const int INF = 1e9;
ll pr[MN];
ll da[MN];
ll db[NN][NN];
ll n,a,b;
bool dpa(ll bm) {
	fill(begin(da),end(da),INF);
	da[0] = 0;
	for(int i=0;i<n;i++) {
		if(da[i] >= b) {continue;}
		for(int j=i+1;j<=n;j++) {
			ll wal = pr[j]-pr[i];
			if((wal&bm) == wal) {
				da[j] = min(da[j],da[i]+1);
			}
		}
	}
	return (da[n] <= b);
}
bool dpb(ll bm) {
	memset(db,0,sizeof(db));
	db[0][0] = 1;
	for(int i=0;i<n;i++) {
		for(int j=0;j<b;j++) {
			if(!db[i][j]) {
				continue;
			}
			for(int k=i+1;k<=n;k++) {
				ll wal = pr[k]-pr[i];
				if((wal&bm) == wal) {
					db[k][j+1] = 1;
				}
			}
		}
	}
	for(int i=a;i<=b;i++) {
		if(db[n][i]) {return true;}
	}
	return false;
}
int main() {
	cin >> n >> a >> b;
	pr[0] = 0;
	for(int i=0;i<n;i++) {
		ll t;
		cin >> t;
		pr[i+1] = pr[i]+t;
	}
	ll res = (1LL<<MB)-1;
	for(int ba=MB-1;ba>=0;ba--) {
		bool bop;
		if(a > 1) {
			bop = dpb(res^(1LL<<ba));
		} else {
			bop = dpa(res^(1LL<<ba));
		}
		//cout << "bop it " << res << '\n';
		if(bop) {res ^= (1LL<<ba);}
	}
	cout << res << '\n';
}
#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...