根据 WA 的提示,全是方案错误
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double llb;
#define F(i, a, b) for (int i = (a); i <= (b); i++)
#define DF(i, a, b) for (int i = (a); i >= (b); i--)
#define FE(i, a, b, c) for (int i = (a); i <= (b); i += (c))
#define DFE(i, a, b, c) for (int i = (a); i >= (b); i -= (c))
#define ED(i, u) for (int i = hea[u]; i; i = nex[i])
#define pii pair<int, int>
#define fi first
#define se second
#define All(x) x.begin(), x.end()
#define ALL(x, l, r) x + (l), x + 1 + (r)
#define MST(x, y) memset(x, y, sizeof(x))
#define lowbit(x) (x & -x)
#define PI acos(-1)
template <class... T> void re(T &...a) { (cin >> ... >> a); }
template <class T, class... Ts> void pr(const T &a, const Ts &...b) {
cout << a;
(cout << ... << (cout << ' ', b));
cout << '\n';
}
template <class T, class... Ts> void prs(const T &a, const Ts &...b) {
cout << a;
(cout << ... << (cout << ' ', b));
cout << ' ';
}
template <class T, class... Ts> void prn(const T &a, const Ts &...b) {
cout << a;
(cout << ... << (cout << ' ', b));
}
void pr() { cout << '\n'; }
#define N 1005
#define P 1000000007
#define Say(x) pr(x ? "Yes" : "No")
int n, mx;
int a[N], b[N], c[N];
int dp[N][N];
int pre[N][N];
int ori[N];
struct node {
int l, r, x;
};
vector<node> pre2[N][2];
int nex[N];
vector<int> res[N];
void solve() {
re(n);
F(i, 1, n) re(a[i]);
if (n & 1) {
pr(-1);
return;
}
sort(ALL(a, 1, n));
F(i, 1, n) b[i] = a[i];
int m = unique(ALL(b, 1, n)) - b - 1;
int r = 0;
F(i, 1, m) c[i] = 0;
F(i, 1, m) {
while (r + 1 <= n && a[r + 1] == b[i])
c[i]++, r++;
ori[i] = b[i];
}
mx = 0;
F(i, 1, m) mx = max(mx, c[i]);
if (mx > (n >> 1)) {
pr(-1);
return;
}
F(i, 0, m) F(j, 0, n >> 1) pre[i][j] = 0;
auto check = [&](int k) -> bool {
F(i, 0, m) F(j, 0, k) dp[i][j] = 0;
F(i, 0, m) F(q, 0, 1) pre2[i][q].clear();
dp[0][0] = 1;
F(i, 0, m - 1) {
F(j, 0, k) {
if (dp[i][j]) {
int lmi = max({0, j + c[i + 1] - k, (j + c[i + 1] - k) / 2}), lmx = min(c[i + 1], j);
int t1 = j + c[i + 1] - lmx * 2, t2 = j + c[i + 1] - lmi * 2;
dp[i + 1][t1]++, dp[i + 1][t2 + 2]--;
pre2[i + 1][t1 & 1].push_back({t1, t2, j});
}
}
FE(j, 2, k, 2) dp[i + 1][j] += dp[i + 1][j - 2];
FE(j, 3, k, 2) dp[i + 1][j] += dp[i + 1][j - 2];
F(j, 0, k) dp[i + 1][j] = (dp[i + 1][j] > 0);
}
if (dp[m][0]) {
F(i, 1, m) {
F(j, 0, k) pre[i][j] = 0;
F(q, 0, 1) {
if (!pre2[i][q].size())
continue;
sort(All(pre2[i][q]), [&](node a, node b) {
if (a.l != b.l)
return a.l < b.l;
return a.r < b.r;
});
int now = pre2[i][q][0].l, pos = 0;
while (now <= k) {
while (now < pre2[i][q][pos].l)
now += 2;
if (now > k)
break;
while (pos + 1 < pre2[i][q].size() && now == pre2[i][q][pos + 1].l)
pos++;
while (pos < pre2[i][q].size() && now > pre2[i][q][pos].r)
pos++;
if (pos >= pre2[i][q].size())
break;
pre[i][now] = pre2[i][q][pos].x;
now += 2;
}
}
}
return 1;
}
return 0;
};
int L = mx, R = (n >> 1), mid, ans = -1;
while (L <= R) {
mid = L + R >> 1;
if (check(mid))
ans = mid, R = mid - 1;
else
L = mid + 1;
}
pr(ans);
if (ans == -1)
return;
// F(i, 1, m) {
// F(j, 0, ans) prs(pre[i][j]);
// pr();
// }
int tmp = m;
nex[tmp] = 0;
int now = pre[tmp][0];
while (tmp >= 1) {
nex[tmp - 1] = now;
now = pre[--tmp][now];
}
F(i, 1, ans) res[i].clear();
F(i, 1, m) {
int l = (c[i] + nex[i - 1] - nex[i]) / 2;
int s1 = l, s2 = c[i] - l;
F(j, 1, ans) {
if (res[j].size() & 1) {
if (s1)
s1--, res[j].push_back(i);
} else {
if (s2)
s2--, res[j].push_back(i);
}
}
}
F(i, 1, ans) {
prs(res[i].size());
for (auto j : res[i])
prs(ori[j]);
pr();
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("admin.in", "r", stdin);
// freopen("admin.out", "w", stdout);
#endif
ios::sync_with_stdio(false), cin.tie(nullptr);
// cout << fixed << setprecision(20);
int T;
re(T);
while (T--)
solve();
return 0;
}