Merge(A[1..N], B[1..N]): C = [] i = 1 j = 1 while i <= N AND j <= N: if A[i] < B[j]: append A[i] to C i = i + 1 else: append B[j] to C j = j + 1 while i <= N: append A[i] to C i = i + 1 while j <= N: append B[j] to C j = j + 1 return C
#include<bits/stdc++.h> #define SINGLE_INPUT #define ll long long #define ull unsigned long long #define N 500005 #define MOD 998244353 usingnamespace std;
random_device seed; ranlux48 engine(seed()); intrandom(int l, int r){ uniform_int_distribution<> distrib(l, r); returndistrib(engine); } template<classt,classu> ostream& operator<<(ostream& os,const pair<t,u>& p) { return os<<'['<<p.first<<", "<<p.second<<']'; } template<classt> ostream& operator<<(ostream& os,const vector<t>& v) { os<<'['; int s = 1; for(auto e:v) { if (s) s = 0; else os << ", "; os << e; } return os<<']'; } template<classt,classu> ostream& operator<<(ostream& os,const map<t,u>& mp){ os<<'{'; int s = 1; for(auto [x,y]:mp) { if (s) s = 0; else os << ", "; os<<x<<": "<<y; } return os<<'}'; }
voidsol(){ int n; cin >> n; vector<int> c(2*n); for (auto& i:c) cin >> i; vector<vector<int>> g; for (int i=0; i<2*n;) { int j = i+1; while (j<2*n && c[i] > c[j]) j++; vector<int> t; while (i<j) { t.push_back(c[i]); i++; } g.emplace_back(t); } // cout << g << endl; int sz = g.size(); vector<vector<int>> f(sz, vector<int>(n+1, -1)); // f[i][j] = f[i-1][j] or f[i-1][j-g[i].size()] function<int(int,int)> dfs = [&](int i, int j)->int { if (i == -1) return j == 0; if (f[i][j] != -1) return f[i][j]; f[i][j] = dfs(i-1, j); if (j>=g[i].size()) f[i][j] |= dfs(i-1, j-g[i].size()); return f[i][j]; }; // for (int i=0; i<sz; i++) { // for (int j=0; j<=n; j++) { // cout << i << " " << j << " = " << dfs(i,j) << endl; // } // } if (dfs(sz-1, n) == 0) { cout << "-1\n"; return ; } vector<int> p; for (int i=sz-1, j=n; i>=0; i--) { if (dfs(i-1,j)) continue; j -= g[i].size(); p.push_back(i); } reverse(p.begin(), p.end()); // cout << p << endl; vector<int> a, b; int idx = 0; for (int i=0; i<sz; i++) { if (idx<p.size() && p[idx] == i) { for (int j:g[i]) a.push_back(j); idx++; } else { for (int j:g[i]) b.push_back(j); } } // cout << a << endl; // cout << b << endl; // if (a.size() != b.size()) { // cout << a.size() << " " << b.size() << endl; // assert(0); // } for (int i:a) cout << i << " "; cout << "\n"; for (int i:b) cout << i << " "; cout << "\n"; }