其他分享
首页 > 其他分享> > 「CF1521E」Nastia and a Beautiful Matrix - 题解

「CF1521E」Nastia and a Beautiful Matrix - 题解

作者:互联网


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1e5+5,M=3000+5;
struct node{
	int id,x;
}cnt[N];
int T,n,m,p,a[M][M],ans[M][M];
bool cmp(node u,node v)
{	if(u.x!=v.x)return u.x<v.x;
	else return u.id<v.id;
}
void solve()
{	
	cnt[0].x=p*p-m;cnt[0].id=0;
	for(int i=1;i<=p;i++)
		for(int j=1;j<=p;j++)
			a[i][j]=-1;
	for(int i=1;i<=p;i++)
		for(int j=1;j<=p;j++)
		{	
			if((i&1)==0&&(j&1)==0&&((i+j)&1)==0)
			{	
				a[i][j]=ans[i][j]=0;
				cnt[0].x--;
				a[i-1][j]=a[i+1][j]=1;
				a[i][j-1]=a[i][j+1]=2;
			}
		}
	int x=0,y=n;
	while(x<=n&&cnt[x].x==0)x++;
	while(y>=0&&cnt[y].x==0)y--;
	for(int i=1;i<=p;i++)
		for(int j=1;j<=p;j++)
		{	
			if(a[i][j]==0)continue;
			else if(a[i][j]==1)
			{	
				ans[i][j]=cnt[x].id;
				cnt[x].x--;
				while(x<=n&&cnt[x].x==0)x++;
			}
			else if(a[i][j]==2)
			{	
				ans[i][j]=cnt[y].id;
				cnt[y].x--;
				while(y>=0&&cnt[y].x==0)y--;
			}
		}
	for(int i=1;i<=p;i++)
		for(int j=1;j<=p;j++)
		{	
			if(a[i][j]!=-1)continue;
			ans[i][j]=cnt[x].id;
			cnt[x].x--;
			while(x<=n&&cnt[x].x==0)x++;
		}
}
int main()
{	
	scanf("%d",&T);
	while(T--)
	{	
		scanf("%d%d",&m,&n);
		for(int i=1;i<=n;i++)
		{	
			scanf("%d",&cnt[i].x);
			cnt[i].id=i;
		}
		sort(cnt+1,cnt+1+n,cmp);
		if(m==1)
		{	
			printf("1\n%d\n",cnt[n]);
			continue;
		}
		p=2;
		while(p*p-(p/2)*(p/2)<m)p++;
		while(cnt[n].x>p*p-(p/2)*(p/2)-(p/2)*((p+1)/2))p++;
		solve();
		printf("%d\n",p);
		for(int i=1;i<=p;i++)
		{	
			for(int j=1;j<=p;j++)
				printf("%d ",ans[i][j]);
			printf("\n");
		}
	}
	return 0;
}

\[\text{by Rainy7} \]

标签:Beautiful,cnt,int,题解,Nastia,矩阵,times,include,赋值
来源: https://www.cnblogs.com/Rainy7/p/cf1521e-solution.html