제출 #721890

#제출 시각아이디문제언어결과실행 시간메모리
721890n0sk1llBali Sculptures (APIO15_sculpture)C++14
100 / 100
154 ms468 KiB
#include <bits/stdc++.h>

#define FAST ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);cerr.tie(0)
#define mp make_pair
#define xx first
#define yy second
#define pb push_back
#define pf push_front
#define popb pop_back
#define popf pop_front
#define all(x) x.begin(),x.end()
#define ff(i,a,b) for (int i = a; i < b; i++)
#define fff(i,a,b) for (int i = a; i <= b; i++)
#define bff(i,a,b) for (int i = b-1; i >= a; i--)
#define bfff(i,a,b) for (int i = b; i >= a; i--)

using namespace std;
long double typedef ld;
unsigned int typedef ui;
long long int typedef li;
pair<int,int> typedef pii;
pair<li,li> typedef pli;
pair<ld,ld> typedef pld;
vector<vector<int>> typedef graph;
unsigned long long int typedef ull;
//const int mod = 998244353;
const int mod = 1000000007;







//Note to self: Check for overflow

li a[2006];
li pre[2006];

bool mz[103][103];

li brute(int n, int A, int B)
{
    li ans=0;

    li include=0;
    bff(b,0,50)
    {
        li cur=include|(1ll<<b);
        fff(k,0,n) fff(i,1,n) mz[k][i]=0;
        mz[0][n+1]=1;

        fff(k,1,n) fff(i,1,n) fff(j,i,n)
            if (!((pre[j]-pre[i-1])&cur)) mz[k][i]|=mz[k-1][j+1];

        bool los=true;
        fff(k,A,B) if (mz[k][1]) los=false;

        if (los) ans|=(1ll<<b);
        else include=cur;
    }

    return ans;
}

int dp[2006];

int main()
{
    FAST;

    int n,A,B; cin>>n>>A>>B;
    fff(i,1,n) cin>>a[i];
    fff(i,1,n) pre[i]=pre[i-1]+a[i];

    if (n<=100) return cout<<brute(n,A,B),0;

    int k=B;
    li ans=0;

    li include=0;
    bff(b,0,50)
    {
        li cur=include|(1ll<<b);
        fff(i,1,n) dp[i]=mod;
        dp[n+1]=0;

        bfff(i,1,n)
        {
            li tmp=0;
            fff(j,i,n)
            {
                tmp+=a[j];
                if (!(tmp&cur)) dp[i]=min(dp[i],dp[j+1]+1);
            }
        }

        if (dp[1]>k) ans|=(1ll<<b);
        else include=cur;
    }

    cout<<ans<<"\n";
}

//Note to self: Check for overflow

/*

6 1 3
8 1 2 1 5 4

10 1 10
1 1 1 1 1 1 1 1 1 1

*/
#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...