Submission #223654

#TimeUsernameProblemLanguageResultExecution timeMemory
223654MODDIBali Sculptures (APIO15_sculpture)C++14
100 / 100
107 ms4608 KiB
#include<bits/stdc++.h>
using namespace std;
const int nmax=2e3+42;
int n,a,b,inp[nmax];
long long pref[nmax];
 
long long current;
 
bool possible;
 
bool been[nmax][nmax];
 
void dfs(int groups,int last_end)
{
    if(possible)return;
    if(groups>b)return;
 
    if(last_end==n)
    {
        if(groups>=a)possible=1;
        return;
    }
 
    if(been[groups][last_end])return;
    been[groups][last_end]=1;
 
    if(((pref[n]-pref[last_end])&current)==(pref[n]-pref[last_end]))dfs(groups+1,n);
 
    for(int j=last_end+1;j<n;j++)
    {
        long long sum=pref[j]-pref[last_end];
        if((current&sum)==sum)dfs(groups+1,j);
    }
}
 
int dp[nmax];
void special()
{
    dp[0]=0;
    for(int i=1;i<=n;i++)
    {
        dp[i]=1e9;
        for(int j=i;j>=1;j--)
        {
            long long sum=pref[i]-pref[j-1];
            if((sum&current)==sum)dp[i]=min(dp[i],dp[j-1]+1);
        }
    }
 
    //for(int i=1;i<=n;i++)cout<<dp[i]<<" ";cout<<endl;
 
    possible=(dp[n]<=b);
}
bool can(long long to_test)
{
    current=to_test;
 
    memset(been,0,sizeof(been));
 
    possible=0;
 
    if(a==1)special();
    else dfs(0,0);
 
    return possible;
}
int main()
{
    scanf("%i%i%i",&n,&a,&b);
    for(int i=1;i<=n;i++)scanf("%i",&inp[i]);
 
    for(int i=1;i<=n;i++)pref[i]=pref[i-1]+inp[i];
 
    long long output=(1LL<<41)-1;
 
    for(int i=40;i>=0;i--)
        if(can(output-(1LL<<i)))output=output-(1LL<<i);
 
    printf("%lld\n",output);
    return 0;
}

Compilation message (stderr)

sculpture.cpp: In function 'int main()':
sculpture.cpp:69:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%i%i%i",&n,&a,&b);
     ~~~~~^~~~~~~~~~~~~~~~~~~
sculpture.cpp:70:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for(int i=1;i<=n;i++)scanf("%i",&inp[i]);
                          ~~~~~^~~~~~~~~~~~~~
#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...