求调,玄关
查看原帖
求调,玄关
466596
MorningStarCzy楼主2024/12/18 20:55
#include<bits/stdc++.h>
using namespace std;
const int N=2005;
int a[N][N];
int u[N],d[N],l[N],r[N];
//u:i号色最上 
//d:i号色最下 
//l:i号色最左 
//r:i号色最右 
int ans[N];
void Solve()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			char ch=getchar();
			a[i][j]=int(ch-'0');
		}
		getchar();
	}
//	for(int i=1;i<=n;i++)
//	{
//		for(int j=1;j<=n;j++)
//			cout<<a[i][j]<<" ";
//		cout<<endl;
//	}
	for(int i=0;i<=9;i++) ans[i]=0,u[i]=n+1,d[i]=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			u[a[i][j]]=min(u[a[i][j]],i);
			d[a[i][j]]=max(d[a[i][j]],i);
		}
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=9;j++) l[j]=n+1,r[j]=0;
		for(int j=1;j<=n;j++)
		{
			l[a[i][j]]=min(l[a[i][j]],j);
			r[a[i][j]]=max(l[a[i][j]],j);
		}
		for(int j=0;j<=9;j++)
		{
			ans[j]=max(ans[j],(r[j]-l[j])*max(n-i,i-1));
			int h=max(i-u[j],d[j]-i);
			int w=max(r[j]-1,n-l[j]);
			if(h<0) h=0;
			if(w<0) w=0;
			ans[j]=max(ans[j],h*w);
		}
	}
	//fen ge xian
	for (int i=0;i<=9;i++) l[i]=n+1,r[i]=0;
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=n;j++)
		{
			l[a[i][j]]=min(l[a[i][j]],j);
			r[a[i][j]]=max(r[a[i][j]],j);
		}
	}
	for(int j=1;j<=n;j++)
	{
		for(int i=0;i<=9;i++) u[i]=n+1,d[i]=0;
		for(int i=1;i<=n;i++)
		{
			u[a[i][j]]=min(u[a[i][j]],i);
			d[a[i][j]]=max(d[a[i][j]],i);
		}
		for(int i=0;i<=9;i++)
		{
			ans[i]=max(ans[i],(d[i]-u[i])*max(j-1,n-j));
			int w=max(j-l[i],r[i]-j);
			int h=max(d[i]-1,n-u[i]);
			if (h<0) h=0;
			if (w<0) w=0;
			ans[i]=max(ans[i],h*w);
		}
	}
	for(int i=0;i<=9;i++) cout<<ans[i]<<" ";
	cout<<endl;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int T;cin>>T;
	while(T--) Solve();
	return 0;
}

错的莫名其妙,提交记录

2024/12/18 20:55
加载中...