Submission #520623

#TimeUsernameProblemLanguageResultExecution timeMemory
520623AlexandruabcdeBali Sculptures (APIO15_sculpture)C++14
100 / 100
101 ms532 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
constexpr int NMAX = 2005;

int N, A, B;
LL sp[NMAX];

bool dp1[NMAX][NMAX];
int dp2[NMAX];

void Read () {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> N >> A >> B;

    for (int i = 1; i <= N; ++ i ) {
        int x;
        cin >> x;

        sp[i] = sp[i-1] + 1LL * x;
    }
}

bool Solve_One (LL mask, int what_bit) {
    dp1[0][0] = 1;

    for (int i = 1; i <= N; ++ i) {
        for (int j = 1; j <= N; ++ j ) {
            dp1[i][j] = 0;

            for (int k = i; k >= 1; -- k ) {
                if (dp1[k-1][j-1] == 0) continue;

                LL val = sp[i] - sp[k-1];

                val >>= what_bit;
                val <<= what_bit;

                if ((val|mask) == mask) dp1[i][j] = 1;
            }
        }
    }

    bool ans = 0;
    for (int x = A; x <= B; ++ x )
        ans |= dp1[N][x];

    return ans;
}

bool Solve_Two (LL mask, int what_bit) {
    dp2[0] = 0;

    for (int i = 1; i <= N; ++ i ) {
        dp2[i] = N+1;
        for (int j = i; j >= 1; -- j ) {
            LL val = sp[i] - sp[j-1];

            val >>= what_bit;
            val <<= what_bit;

            if ((val|mask) == mask)
                dp2[i] = min(dp2[i], dp2[j-1] + 1);
        }
    }

    return (dp2[N] <= B);
}

int main () {
    Read();

    LL ans = 0;
    for (int bit = 40; bit >= 0; -- bit ) {
        bool ok = 1;
        if (A == 1) ok = Solve_Two(ans, bit);
        else ok = Solve_One(ans, bit);

        if (ok) continue;
        else ans += (1LL<<bit);
    }

    cout << ans << '\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...