| 记录编号 |
351142 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
658.[ZJOI 2007] 棋盘制作 |
最终得分 |
100 |
| 用户昵称 |
rewine |
是否通过 |
通过 |
| 代码语言 |
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(){;}