Submission #1298871

#TimeUsernameProblemLanguageResultExecution timeMemory
1298871AbdullahIshfaqBali Sculptures (APIO15_sculpture)C++20
Compilation error
0 ms0 KiB
// gemini code 
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>

using namespace std;

// Maximum number of groups N (or B) is 100 in Subtask 4
const int MAXN = 105;
const int MAX_GROUPS = 105;

// DP table for feasibility check: dp[i][j] is true if the first i sculptures can be partitioned 
// into j groups such that the OR-sum of all groups respects the 'target_or' prefix.
bool dp[MAXN][MAX_GROUPS];

// Check function for the feasibility of an OR-sum.
// current_prefix: the required upper bound for the final OR-sum.
bool check(int N, int A, int B, const vector<long long>& Y, long long current_prefix) {
    // 1. Calculate prefix sums for O(1) range sum calculation
    vector<long long> prefix_sum(N + 1, 0);
    for (int i = 0; i < N; ++i) {
        prefix_sum[i + 1] = prefix_sum[i] + Y[i];
    }

    // 2. Initialize DP table: dp[i][j] = false (cannot reach state i with j groups)
    for (int i = 0; i <= N; ++i) {
        for (int j = 0; j <= B; ++j) {
            dp[i][j] = false;
        }
    }
    // Base case: 0 sculptures, 0 groups is possible.
    dp[0][0] = true;

    // 3. Dynamic Programming
    // i: end position of the overall partition (1 to N)
    for (int i = 1; i <= N; ++i) {
        // j: number of groups used so far (1 to B)
        for (int j = 1; j <= B; ++j) {
            // k: end position of the *previous* group (0 to i-1)
            for (int k = 0; k < i; ++k) {
                if (dp[k][j - 1]) {
                    // Current group is from k+1 to i
                    long long group_sum = prefix_sum[i] - prefix_sum[k];

                    // Condition Check: (S OR P) = P
                    // This is equivalent to: (S & ~P) == 0
                    // Ensures that group_sum S does not have any bit set that we have committed 
                    // to be 0 (i.e., bits in the region ~current_prefix)
                    if ((group_sum | current_prefix) == current_prefix) {
                        dp[i][j] = true;
                        // Optimization: once dp[i][j] is true, break inner loops
                        break; 
                    }
                }
            }
        }
    }

    // 4. Feasibility Result
    // Check if the full partition (N sculptures) is possible with A <= groups <= B
    for (int j = A; j <= B; ++j) {
        if (dp[N][j]) {
            return true;
        }
    }
    return false;
}

void solve() {
    int N, A, B;
    if (!(cin >> N >> A >> B)) return;

    vector<long long> Y(N);
    long long total_sum = 0;
    for (int i = 0; i < N; ++i) {
        cin >> Y[i];
        total_sum += Y[i];
    }

    // The maximum possible OR-sum is bounded by total_sum.
    // We search from the MSB of total_sum down to bit 0.
    int max_bits = 0;
    if (total_sum > 0) {
        max_bits = 63 - __builtin_clzll(total_sum); // Find the position of the MSB
    }

    long long min_or_sum = 0;

    // Greedy Bit-by-Bit Search
    for (int k = max_bits; k >= 0; --k) {
        // Current guaranteed prefix of the answer is min_or_sum.
        
        // 1. Try to set the k-th bit to 0.
        // The check function must ensure that all group sums S are submasks of min_or_sum
        // (for bits > k) AND all bits < k (which we don't care about yet).
        // Since min_or_sum is the committed answer so far, passing it to check ensures that 
        // no group sum violates the "0" bits we have already fixed in higher positions.
        
        if (check(N, A, B, Y, min_or_sum)) {
            // Case 1: Possible to achieve the current OR-sum prefix (with bit k as 0).
            // min_or_sum remains unchanged (k-th bit is 0).
            continue; 
        } else {
            // Case 2: IMPOSSIBLE to achieve the current OR-sum prefix (with bit k as 0).
            // The k-th bit MUST be 1. We commit to 1 and update the prefix.
            min_or_sum |= (1LL << k);
        }
    }

    cout << min_or_sum << endl;
}

// int main() {
//     // For testing with Sample Input: 6 1 3 | 8 1 2 1 5 4 -> Output: 11
//     solve();
//     return 0;
// }

Compilation message (stderr)

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crt1.o: in function `_start':
(.text+0x1b): undefined reference to `main'
collect2: error: ld returned 1 exit status