比赛 不准粘代码,必须自己写(HS除外) 评测结果 AAAAAAAAAA
题目名称 棋盘制作 最终得分 100
用户昵称 瑆の時間~無盡輪迴·林蔭 运行时间 1.638 s
代码语言 C++ 内存使用 74.75 MiB
提交时间 2019-09-23 20:21:12
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,ans1,ans2;
int L[2001][2001],R[2001][2001],UP[2001][2001];
int val[2001][2001];
int main()
{
	freopen("makechess.in","r",stdin);
	freopen("makechess.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			scanf("%d",&val[i][j]);
			L[i][j]=j;
			R[i][j]=j;
			UP[i][j]=1;
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=2;j<=m;j++)
		{
			if(val[i][j]!=val[i][j-1])
			{
				L[i][j]=L[i][j-1];
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=m-1;j>0;j--)
		{
			if(val[i][j]!=val[i][j+1])
			{
				R[i][j]=R[i][j+1];
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(i>1&&val[i][j]!=val[i-1][j])
			{
				L[i][j]=max(L[i][j],L[i-1][j]);
				R[i][j]=min(R[i][j],R[i-1][j]);//
				UP[i][j]=UP[i-1][j]+1;
			}
			int a=R[i][j]-L[i][j]+1;
			int h=min(a,UP[i][j]);
			ans1=max(ans1,h*h);
			ans2=max(ans2,a*UP[i][j]); 
		}
	}
	printf("%d\n%d",ans1,ans2);
	return 0;
}