제출 #91550

#제출 시각아이디문제언어결과실행 시간메모리
91550Bodo171Bali Sculptures (APIO15_sculpture)C++14
100 / 100
183 ms1116 KiB
#include <iostream> #include <fstream> using namespace std; const int nmax=2005; long long v[nmax]; int best[nmax]; bool dp[105][105]; long long sum,frb,ans; int n,i,j,k,a,b; bool chk_brt(long long val) { dp[0][0]=1; for(i=1;i<=n;i++) for(j=1;j<=n;j++) dp[i][j]=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { sum=0; for(k=j;k>=1;k--) { sum+=v[k]; if((sum&frb)==0) dp[i][j]|=dp[i-1][k-1]; } if(i>=a&&i<=b&&dp[i][n]) return 1; } return 0; } bool chk_smen() { best[0]=0; for(i=1;i<=n;i++) best[i]=n+1; for(i=1;i<=n;i++) { sum=0; for(j=i;j>=1;j--) { sum+=v[j]; if((sum&frb)==0) best[i]=min(best[i],best[j-1]+1); } } return (best[n]<=b); } bool check(long long val) { frb=(((1LL<<61)-1)^val); if(n<=100) return chk_brt(val); return chk_smen(); } int main() { //freopen("data.in","r",stdin); cin>>n>>a>>b; for(i=1;i<=n;i++) cin>>v[i]; ans=(1LL<<61)-1; for(long long p=60;p>=0;p--) if(check(ans-(1LL<<p))) ans-=(1LL<<p); cout<<ans; 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...