Submission
Status:
PPPP-PP---
Subtask/Task Score:
60/100
Score: 60
User: Kidmaiok
Problemset: ประลอง
Language: cpp
Time: 0.005 second
Submitted On: 2026-10-13 09:57:43
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define space << ' '
#define nl << endl
struct Node {
int index;
int prev;
};
unordered_map<ll, int> dp[105];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<ll> a(n);
ll total = 0;
for (int i = 0; i < n; i++) {
cin >> a[i];
total += a[i];
}
int k = n / 2;
vector<Node> nodes;
nodes.push_back({-1, -1});
dp[0][0] = 0;
for (int i = 0; i < n; i++) {
for (int c = min(k, i + 1); c >= 1; c--) {
for (auto [sum, prevNode] : dp[c - 1]) {
ll newSum = sum + a[i];
if (dp[c].count(newSum))
continue;
int id = nodes.size();
nodes.push_back({i, prevNode});
dp[c][newSum] = id;
}
}
}
ll bestDiff = LLONG_MAX;
int bestNode = 0;
for (auto [sum, id] : dp[k]) {
ll diff = llabs(total - 2 * sum);
if (diff < bestDiff) {
bestDiff = diff;
bestNode = id;
}
}
vector<bool> selected(n, false);
while (bestNode != 0) {
selected[nodes[bestNode].index] = true;
bestNode = nodes[bestNode].prev;
}
for (int group = 0; group < 2; group++) {
bool first = true;
for (int i = 0; i < n; i++) {
if (selected[i] == (group == 0)) {
if (!first) cout << ' ';
cout << a[i];
first = false;
}
}
cout << '\n';
}
}