Submission #1159089

#TimeUsernameProblemLanguageResultExecution timeMemory
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...