Submission #169534

#TimeUsernameProblemLanguageResultExecution timeMemory
169534Andrei_CotorBali Sculptures (APIO15_sculpture)C++14
100 / 100
110 ms504 KiB
#include<iostream>

using namespace std;

int Dp1[105][105],Dp2[2005],A[2005],n;

bool check(long long msk, int dec, int lim)
{
    Dp2[0]=0;
    for(int i=1; i<=n; i++)
    {
        long long sum=A[i];
        Dp2[i]=lim+2;
        for(int j=i-1; j>=0; j--)
        {
            if((((msk>>dec)&(sum>>dec))^(sum>>dec))==0)
                Dp2[i]=min(Dp2[i],1+Dp2[j]);
            sum+=A[j];
        }
    }
    return (Dp2[n]<=lim);
}

bool check(long long msk, int dec, int st, int dr)
{
    for(int i=1; i<=n; i++)
        for(int j=1; j<=dr; j++)
            Dp1[i][j]=0;

    Dp1[0][0]=1;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=dr; j++)
        {
            long long sum=A[i];
            for(int k=i-1; k>=0; k--)
            {
                if((((msk>>dec)&(sum>>dec))^(sum>>dec))==0 && Dp1[k][j-1])
                    Dp1[i][j]=1;
                sum+=A[k];
            }
        }
    }
    for(int i=st; i<=dr; i++)
        if(Dp1[n][i])
            return 1;
    return 0;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int a,b;
    cin>>n>>a>>b;
    for(int i=1; i<=n; i++)
        cin>>A[i];

    long long rez=0;
    for(int i=40; i>=0; i--)
    {
        if(a==1)
        {
            if(!check(rez,i,b))
                rez+=(1LL<<i);
        }
        else
        {
            if(!check(rez,i,a,b))
                rez+=(1LL<<i);
        }
    }
    cout<<rez<<"\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...