제출 #1159089

#제출 시각아이디문제언어결과실행 시간메모리
1159089MisterReaperBootfall (IZhO17_bootfall)C++20
13 / 100
1093 ms4568 KiB
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG
    #include "debug.h"
#else
    #define debug(...) void(23)
#endif

constexpr int max_N = int(500) + 5;
constexpr int max_A = max_N;
constexpr int UB = max_N * max_A;

using B = std::bitset<UB>;

std::bitset<UB> pre[max_N], suf[max_N];

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N;
    std::cin >> N;
    std::vector<int> A(N + 1);
    for (int i = 0; i < N; ++i) {
        std::cin >> A[i];
    }

    bool bo[2] {};
    for (int i = 0; i < N; ++i) {
        bo[A[i] & 1] = true;
    }
    if (bo[0] && bo[1]) {
        std::cout << "0\n";
        return 0;
    } else if (N == 1) {
        std::cout << "0\n";
        return 0;
    }

    N++;
    int sum = std::accumulate(A.begin(), A.end(), 0);

    auto check = [&]() -> bool {
        pre[0][0] = true;
        for (int i = 0; i < N; ++i) {
            pre[i + 1] = pre[i] | (pre[i] << A[i]);
        }
        suf[N][0] = true;
        for (int i = N - 1; i >= 0; --i) {
            suf[i] = suf[i + 1] | (suf[i + 1] << A[i]);
        }

        for (int i = 0; i < N; ++i) {
            int nsum = sum - A[i];
            if (nsum & 1) {
                return false;
            }
            int need = nsum >> 1;
            bool good = false;
            for (int k = 0; k <= need; ++k) {
                if (pre[i][k] && suf[i + 1][need - k]) {
                    good = true;
                    break;
                }
            }
            if (!good) {
                return false;
            }
        }
        return true;
    };

    std::vector<int> ans;
    for (int i = bo[0] ? 0 : 1; i <= sum; i += 2) {
        A[N - 1] = i;
        sum += i;
        if (check()) {
            ans.emplace_back(i);
        }
        sum -= i;
        A[N - 1] = 0;
    }

    std::cout << ans.size() << '\n';
    for (auto i : ans) {
        std::cout << i << " \n"[i == ans.back()];
    }

    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...
#Verdict Execution timeMemoryGrader output
Fetching results...