记录编号 174841 评测结果 AAAAAAAAAA
题目名称 658.[ZJOI 2007] 棋盘制作 最终得分 100
用户昵称 Gravatarzys 是否通过 通过
代码语言 C++ 运行时间 2.699 s
提交时间 2015-08-03 07:36:27 内存使用 61.63 MiB
显示代码纯文本
#define Max(a,b)((a)>(b)?(a):(b))
#define Min(a,b)((a)<(b)?(a):(b))
 
#include<cstdio>
 
using namespace std;
 int temp;
char s;
inline int in()
{
	temp=0;s=getchar();
	while(s<48||s>57)
		s=getchar();
	for(;s>=48&&s<=57;s=getchar())
		temp=temp*10+s-48;
	return temp;
}
 
int n,m,smax[2005][2005],a[2005][2005];
int rmax[2005][2005],xmax[2005][2005],z,c;
 
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++)
            a[i][j]=in();
    for(int i=1;i<=n;i++)
    {
        int head=1,tail=1;
        while(head<=m)
        {    
             while(head>tail)tail++;
             while(head<=tail&&a[i][tail+1]^a[i][tail]&&tail+1<=m)tail++;  
             rmax[i][head]=tail;head++;
        }
    }
    for(int i=1;i<=m;i++)
    {
        int head=1,tail=1;
        while(head<=n)
        {     
            while(head>tail)tail++;   
            while(head<=tail&&a[tail][i]^a[tail+1][i]&&tail+1<=n)tail++;      
            xmax[head][i]=tail;head++;
        }
        head=tail=n;
        while(head>=1)
        {
            while(head<tail)tail--;
            while(head>=tail&&a[tail][i]^a[tail-1][i]&&tail-1>=1)tail--;
            smax[head][i]=tail;head--;
        }
    }
    
    for(int i=1;i<=m;i++)
    {
        int q[2000]={0};int head=1,tail=0,k[2005]={0};
        for(int j=1;j<=n;j++)
        {
            while(head<=tail&&q[head]<smax[j][i])head++;
            while(head<=tail&&rmax[j][i]<=rmax[q[tail]][i])tail--;
            if(head<=tail)k[j]=q[tail]+1;//!!!!
            else k[j]=smax[j][i];  
            q[++tail]=j;
        }
        head=1;tail=0;
        for(int j=n;j>=1;j--)
        {
            while(head<=tail&&q[head]>xmax[j][i])head++;
            while(head<=tail&&rmax[j][i]<=rmax[q[tail]][i])tail--;
            if(head<=tail) 
            {
                c=Max(c,(q[tail]-k[j])*(rmax[j][i]-i+1));//!!!!
                z=Max(z,Min(q[tail]-k[j],rmax[j][i]-i+1)*Min(q[tail]-k[j],rmax[j][i]-i+1));
            }
            else
            {
                c=Max(c,(xmax[j][i]-k[j]+1)*(rmax[j][i]-i+1));
                z=Max(z,Min(xmax[j][i]-k[j]+1,rmax[j][i]-i+1)*Min(xmax[j][i]-k[j]+1,rmax[j][i]-i+1));
            }
            q[++tail]=j;
        }
    }
    printf("%d\n%d",z,c);
}