제출 #520623

#제출 시각아이디문제언어결과실행 시간메모리
520623AlexandruabcdeBali Sculptures (APIO15_sculpture)C++14
100 / 100
101 ms532 KiB
#include <bits/stdc++.h> using namespace std; typedef long long LL; constexpr int NMAX = 2005; int N, A, B; LL sp[NMAX]; bool dp1[NMAX][NMAX]; int dp2[NMAX]; void Read () { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> A >> B; for (int i = 1; i <= N; ++ i ) { int x; cin >> x; sp[i] = sp[i-1] + 1LL * x; } } bool Solve_One (LL mask, int what_bit) { dp1[0][0] = 1; for (int i = 1; i <= N; ++ i) { for (int j = 1; j <= N; ++ j ) { dp1[i][j] = 0; for (int k = i; k >= 1; -- k ) { if (dp1[k-1][j-1] == 0) continue; LL val = sp[i] - sp[k-1]; val >>= what_bit; val <<= what_bit; if ((val|mask) == mask) dp1[i][j] = 1; } } } bool ans = 0; for (int x = A; x <= B; ++ x ) ans |= dp1[N][x]; return ans; } bool Solve_Two (LL mask, int what_bit) { dp2[0] = 0; for (int i = 1; i <= N; ++ i ) { dp2[i] = N+1; for (int j = i; j >= 1; -- j ) { LL val = sp[i] - sp[j-1]; val >>= what_bit; val <<= what_bit; if ((val|mask) == mask) dp2[i] = min(dp2[i], dp2[j-1] + 1); } } return (dp2[N] <= B); } int main () { Read(); LL ans = 0; for (int bit = 40; bit >= 0; -- bit ) { bool ok = 1; if (A == 1) ok = Solve_Two(ans, bit); else ok = Solve_One(ans, bit); if (ok) continue; else ans += (1LL<<bit); } cout << ans << '\n'; 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...