Submission
Status:
PPPPPPP-PP
Subtask/Task Score:
90/100
Score: 90
User: chokun
Problemset: ประลอง
Language: cpp
Time: 0.004 second
Submitted On: 2026-10-14 20:12:40
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
vector<int> arr(n);
int min_possible = 0;
int max_possible = 0;
int total_sum = 0;
for (int i = 0; i < n; i++) {
cin >> arr[i];
total_sum += arr[i];
if (arr[i] < 0) min_possible += arr[i];
else max_possible += arr[i];
}
int k1 = n / 2;
int k2 = (n + 1) / 2;
int max_k = k2;
int offset = -min_possible;
int S_range = max_possible - min_possible + 1;
int dim2 = max_k + 1;
int dim3 = S_range;
long long total_size = (long long)(n + 1) * dim2 * dim3;
vector<bool> dp(total_size, false);
auto get_idx = [&](int i, int j, int s) {
return (long long)i * dim2 * dim3 + (long long)j * dim3 + s;
};
dp[get_idx(n, 0, offset)] = true;
for (int i = n - 1; i >= 0; i--) {
int x = arr[i];
for (int j = 0; j <= max_k; j++) {
for (int s = 0; s < S_range; s++) {
if (dp[get_idx(i + 1, j, s)]) {
dp[get_idx(i, j, s)] = true;
}
if (j > 0 && s - x >= 0 && s - x < S_range && dp[get_idx(i + 1, j - 1, s - x)]) {
dp[get_idx(i, j, s)] = true;
}
}
}
}
int best_diff = 2e9;
vector<pair<int, int>> valid_states;
vector<int> sizes = {k1};
if (k1 != k2) sizes.push_back(k2);
for (int k : sizes) {
for (int s = 0; s < S_range; s++) {
if (dp[get_idx(0, k, s)]) {
int actual_sum = s - offset;
int diff = abs(2 * actual_sum - total_sum);
if (diff < best_diff) {
best_diff = diff;
valid_states.clear();
valid_states.push_back({k, s});
} else if (diff == best_diff) {
valid_states.push_back({k, s});
}
}
}
}
vector<int> best_path;
bool has_best_path = false;
for (auto& state : valid_states) {
int rem_j = state.first;
int rem_s = state.second;
vector<int> path;
path.reserve(n);
for (int i = 0; i < n; i++) {
if (dp[get_idx(i + 1, rem_j, rem_s)]) {
path.push_back(0);
} else {
int x = arr[i];
path.push_back(1);
rem_j--;
rem_s -= x;
}
}
if (!has_best_path || path < best_path) {
best_path = path;
has_best_path = true;
}
}
bool first = true;
for (int i = 0; i < n; i++) {
if (best_path[i] == 1) {
if (!first) cout << " ";
cout << arr[i];
first = false;
}
}
cout << "\n";
first = true;
for (int i = 0; i < n; i++) {
if (best_path[i] == 0) {
if (!first) cout << " ";
cout << arr[i];
first = false;
}
}
cout << "\n";
}