#include<iostream>
#include<vector>
// int a[100002];//[2];//getchar();
using namespace std;
// struct e{
// int nm,ct;
// }x[1000002];
//vector<int>x[1000002],z(1000002);
int main() {
int T;
cin>>T;
while(T--) {
vector<int>x[1000002],z(1000002);
int n;
cin>>n;
if(n%2) {
cout<<"-1\n";
for(int j=1,i=0,t; j<=n; ++j) {
cin>>t;
}
continue;
}
z.clear();
for(int j=1,i=0,t; j<=n; ++j) {
cin>>t;++z[t];
}
for(int j=1; j<=1000000; ++j) {
if(z[j]){
x[z[j]].push_back(j);}
}int mx=0;
for(int j=1000000; j>=0; --j) {
if(!x[j].empty()){mx=j;break;}
}int mxx=mx;
vec:
// mx=5;
vector<int>v[mx+1];int p=0;
if(2*mx>n){cout<<"-1\n";
//cout<<100-t<<'\n';
// z.clear();
goto ctn;}
for(int j=mx,t,q; j>0; --j) {
for(auto t:x[j]){
// t=x[j].back();
if(p>=mx){p=0;}
q=p;--q;
if(q<=0){q=mx;--q;}
if(p<j&&v[p].size()%2||mx!=mxx){goto ps;}
for(int i=0;i<mx;++i,++p){
if(p>=mx){p=0;}
if(v[p].size()%2){break;}
}ps:
for(int i=0;i<j;++i,++p){
if(p>=mx){p=0;}
v[p].push_back(t);
}if(p>=mx){p=0;}
//if(v[p].size()%2){p=0;}
// x[j].pop_back();
}
// x[z[j]].push_back(j);
}
for(int j=mx-1; j>=0; --j) {
if(v[j].size()%2) {
// cout<<"-1\n";
//cout<<100-t<<'\n';
//z.clear();
++mx;
goto vec;
}
}
cout<<mx<<'\n';
for(int j=mx-1; j>=0; --j) {
cout<<v[j].size()<<' ';
for(auto i:v[j]){
cout<<i<<' ';
}
cout<<'\n';//v[j].clear();
}
ctn:
//z.clear();
}
return 0;
}
提供一组数据。
1
10
1 1 1 1 2 2 2 3 3 3
我的程序的输出应该能体现出我的程序的原理。
5
2 2 3
2 1 3
2 1 3
2 1 2
2 1 2