记录编号 351142 评测结果 AAAAAAAAAA
题目名称 658.[ZJOI 2007] 棋盘制作 最终得分 100
用户昵称 Gravatarrewine 是否通过 通过
代码语言 C++ 运行时间 1.079 s
提交时间 2016-11-16 10:58:44 内存使用 76.72 MiB
显示代码纯文本
#pragma inline_recursion(on)
#define pro __attribute__((optimize("-Os")))
#define _inline __attribute__((always_inline))
#include <cstdio>
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <cstring>
#include <queue>
 
using namespace std;
#define FRE(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
typedef unsigned long long lg;
 
namespace PROIO{
	const int L=1<<15,OUTL = 300;
	char chout[OUTL],*pout=chout;
	char buf[L],*s = buf,*t = buf;
	pro inline char getc() {
		if(s==t) t=(s=buf)+fread(buf,1,L,stdin);
        return s==t ? EOF:*s++;
	}
    pro inline void read(int &x) {
	    register bool flag = 0;register char c;
	    while((c=getc())>'9'||c<'0') 
		  if(c == '-') flag = 1;
	    x = c-'0';
	    while((c=getc())<='9'&&c>='0')
	      x = (x<<1)+(x<<3)+c-'0';
	    if(flag) x = -x;
    }
    pro inline void out(lg x) {
        if(!x)*pout++='0';
        int p=0;char buft[20];
        while(x) buft[++p]=x%10+'0',x/=10;
        while(p) *pout++=buft[p--];
        *pout++='\n';
    }
    pro void end(){fwrite(chout,1,pout-chout,stdout);} 
}using PROIO::read;using PROIO::out;using PROIO::end;
 
#define Rep(i, x, y) for (register int i = (x), _ = (y); i <= _; ++i)
 
int n,m,ans1,ans2;
int a[2001][2001];
char c;
int l[2001][2001],r[2001][2001],h[2001][2001];
int f[2001][2001];

int o(int x) {
	return x*x;
} 

pro inline int init(int k) {
	memset(l,0,sizeof l);
	memset(r,0,sizeof r);
	memset(h,0,sizeof h);
	int t = 1;
	for (int i = 1; i <= n; i++) {
		t = 1;
		for (int j = 1; j <= m; j++)
		 if (a[i][j] == k) l[i][j] = t;
		 else l[i][j] = 1,t = j+1;
		t = m;
		for (int j = m; j >= 1; j--)
		 if (a[i][j] == k) r[i][j] = t;
		 else r[i][j] = m,t = j-1;
	}
	for (int i = 1; i <= m ; i++)
	 l[0][i] = 1,r[0][i] = m;
	for (int i = 1; i <= n; i++)
	 for (int j = 1; j <= m; j++)
	  if(a[i][j] == k) {
	 	h[i][j] = h[i-1][j]+1;
	 	l[i][j] = max(l[i][j],l[i-1][j]);
	 	r[i][j] = min(r[i][j],r[i-1][j]);
	 	ans1 = max(ans1,(r[i][j]-l[i][j]+1)*h[i][j]);
	 }
}

pro int ini(int k) {
	memset(f,0,sizeof f);
	for (int i = 1; i <= n; i++)
	 for (int j = 1; j <= m; j++)
	  if(a[i][j] == k) {
	  	f[i][j] = min(f[i][j-1],min(f[i-1][j],f[i-1][j-1]))+1;
	  	ans2 = max(ans2,f[i][j]);
	  }
} 

pro inline int work() {
    FRE(makechess);
    read(n),read(m);
    for (int i = 1; i <= n; i++)
     for (int j = 1; j <= m; j++) {
     	read(a[i][j]);
     	if((i&1) != (j&1))
     	 a[i][j] = !a[i][j];
	 }
     init(0);
	 init(1);
	 ini(0);ini(1);
     printf("%d\n%d",ans2*ans2,ans1);
}
 
int dott = work();
 
int main(){;}