제출 #1271415

#제출 시각아이디문제언어결과실행 시간메모리
1271415cmiucBali Sculptures (APIO15_sculpture)C++20
100 / 100
115 ms584 KiB
#include <iostream> using namespace std; #define int long long const int N = 205; int dp[N * 10], Dp[N][N], a[N * 10], Pre[N * 10], n, A, B, o = 1, Ans, And; int Dp1(){ for (int i=0;i<=n;i++) dp[i] = 1e9; dp[0] = 0; for (int i=1;i<=n;i++){ for (int j=0;j<i;j++){ int s = Pre[i] - Pre[j]; if ((Ans | (s & And)) == Ans) dp[i] = min(dp[i], dp[j] + 1); } } return dp[n]; } void solve1(){ for (int b=60;b>=0;b--){ And |= (o<<b); if (Dp1() > B) Ans |= (o<<b); } } bool Dp2(){ for (int i=0;i<=n;i++){ for (int j=0;j<=n;j++) Dp[i][j] = 0; } Dp[0][0] = 1; for (int i=1;i<=n;i++){ for (int j=1;j<=n;j++){ for (int k=0;k<i;k++){ int s = Pre[i] - Pre[k]; if ((Ans | (s & And)) == Ans) Dp[i][j] |= Dp[k][j-1]; } } } for (int i=A;i<=B;i++) if (Dp[n][i]) return 1; return 0; } void solve2(){ for (int b=60;b>=0;b--){ And |= (o<<b); if (Dp2() == 0) Ans |= (o<<b); } } signed main(){ cin>>n>>A>>B; for (int i=1;i<=n;i++){ cin>>a[i]; Pre[i] = Pre[i-1] + a[i]; } if (A == 1) solve1(); else solve2(); cout<<Ans<<'\n'; } /* 6 1 3 8 1 2 1 5 4 */
#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...