int n; int a[kMaxN * 2]; std::bitset<kMaxS> f[kMaxN * 2][kMaxN]; std::vector<int> v[2];
voidprint(int i, int j, int k){ if (i == 2) return; if (f[i - 1][j][k]) v[0].emplace_back(a[i]), print(i - 1, j, k); else v[1].emplace_back(a[i]), print(i - 1, j - 1, k - a[i]); }
voiddickdreamer(){ std::cin >> n; for (int i = 1; i <= 2 * n; ++i) std::cin >> a[i]; std::sort(a + 1, a + 1 + 2 * n); int sum = std::accumulate(a + 3, a + 1 + 2 * n, 0); f[2][0][0] = 1; for (int i = 3; i <= 2 * n; ++i) { for (int j = 0; j <= std::min(i - 3, n - 1); ++j) { f[i][j] |= f[i - 1][j]; f[i][j + 1] |= (f[i - 1][j] << a[i]); } } int ans = 1e9, s = 0; for (int i = 0; i <= sum; ++i) { if (f[2 * n][n - 1][i] && std::max(i, sum - i) < ans) { ans = std::max(i, sum - i); s = i; } } v[0] = {a[1]}, v[1] = {a[2]}; print(2 * n, n - 1, s); std::sort(v[0].begin(), v[0].end()); std::sort(v[1].begin(), v[1].end(), std::greater<>()); for (auto x : v[0]) std::cout << x << ' '; std::cout << '\n'; for (auto x : v[1]) std::cout << x << ' '; std::cout << '\n'; }