제출 #1319984

#제출 시각아이디문제언어결과실행 시간메모리
1319984NValchanovBali Sculptures (APIO15_sculpture)C++20
100 / 100
81 ms608 KiB
#include <iostream> using namespace std; typedef long long llong; const int MAXN = 2e3 + 10; const int MAXLOG = 41; const llong INF = 4e18 + 10; int n, l, r; int a[MAXN]; bool dp1[MAXN][MAXN]; llong dp2[MAXN]; llong pref[MAXN]; void read() { cin >> n >> l >> r; for(int i = 1; i <= n; i++) { cin >> a[i]; } } void precomp() { for(int i = 1; i <= n; i++) { pref[i] = pref[i - 1] + a[i]; } } bool check1(llong x) { for(int i = 0; i <= n; i++) { dp2[i] = INF; } dp2[0] = 0; for(int i = 1; i <= n; i++) { for(int k = 1; k <= i; k++) { llong sum = pref[i] - pref[k - 1]; if((x | sum) == x) { dp2[i] = min(dp2[i], dp2[k - 1] + 1); } } } return dp2[n] <= r; } bool check2(llong x) { for(int i = 0; i <= n; i++) { for(int j = 0; j <= r; j++) { dp1[i][j] = false; } } dp1[0][0] = true; for(int i = 1; i <= n; i++) { for(int j = 1; j <= r; j++) { for(int k = 1; k <= i; k++) { llong sum = pref[i] - pref[k - 1]; if((x | sum) == x) { dp1[i][j] |= dp1[k - 1][j - 1]; } } } } for(int i = l; i <= r; i++) { if(dp1[n][i]) return true; } return false; } void solve() { llong ans = (1LL << MAXLOG) - 1; for(int bit = MAXLOG - 1; bit >= 0; bit--) { if(l == 1) { if(check1(ans - (1LL << bit))) { ans -= (1LL << bit); } } else { if(check2(ans - (1LL << bit))) { ans -= (1LL << bit); } } } cout << ans << endl; } int main() { read(); precomp(); solve(); 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...