60分求你来Hack(目前全部Hack已过)
查看原帖
60分求你来Hack(目前全部Hack已过)
777701
2022liaojianxiang楼主2025/8/1 08:16
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=4009;
int T,n,a[N],top,stack[N][N],maxn=0;
struct node{int a,b;}b[N];
bool cmp(node x,node y){return x.b>y.b;}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		for(int i=1;i<=maxn;i++)
			stack[i][0]=0;
		scanf("%d",&n); top=0;
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		if(n&1) {printf("-1\n");continue;}
		sort(a+1,a+n+1); a[0]=-1;
		for(int i=1;i<=n;i++)
		{
			if(a[i]!=a[i-1]) 
				b[++top]=node{a[i],0};
			b[top].b++;
		}
		sort(b+1,b+top+1,cmp),maxn=b[1].b;
		if(maxn>n/2){printf("-1\n");continue;}
		for(int i=1;i<=top;i++)
			for(int j=1;j<=b[i].b;j++)
				stack[j][++stack[j][0]]=i;
		int p=1,q=maxn;
		while(p<q)
		{
			while(!(stack[p][0]&1)&&p<q) p++;
			while(!(stack[q][0]&1)&&p<q) q--;
			if(p>=q) break;
			if(stack[p][0]!=stack[q][0])
				stack[q][++stack[q][0]]=stack[p][stack[p][0]--],p++,q--;
			else
			{
				for(int o=p-1;o>=1;o--)
				{
					while(p<=q&&stack[o][0]>=stack[p][0]+2)
						stack[p][++stack[p][0]]=stack[o][stack[o][0]--],p++;
					if(p>q) break;
				}
				if(p>q) break;
				for(int o=q+1;;o++)
				{
					if(o>maxn) stack[++maxn][0]=0;
					while(p<=q&&stack[q][0]>=stack[o][0]+2)
					{
						int u=stack[o][0],v,w;
						sort(stack[o]+1,stack[o]+u+1);
						for(v=stack[q][0];v>=1;v--)
						{
							while(stack[o][u]!=stack[q][v]&&u>0) u--;
							if(!u) break; else continue;
						}
						if(stack[o][u]==stack[q][v]&&u>0) break;
						swap(stack[q][v],stack[q][stack[q][0]]);
						stack[o][++stack[o][0]]=stack[q][stack[q][0]--],q--;
					}
					if(p>q) break;
				}
			}
		}
		printf("%d\n",maxn);
		for(int i=1;i<=maxn;i++)
		{
			printf("%d ",stack[i][0]);
			for(int j=1;j<=stack[i][0];j++)
				printf("%d ",b[stack[i][j]].a);
			printf("\n");
		} 
	}
	return 0;
}
2025/8/1 08:16
加载中...