BZOJ 1057: [ZJOI2007]棋盘制作

来源:互联网 发布:java微信扫一扫 编辑:程序博客网 时间:2024/05/17 22:45

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1057


水题,不解释.


代码:

#include <iostream>#include <cstdio>#include <cstring>#include <string.h>#include <queue>#include <vector>#include <algorithm>#include <cassert>#include <set>#include <map>#include <cmath>#include <ctime>using namespace std;#define rep(i,a,b) for(int i=(a);i<(b);++i)#define rrep(i,a,b) for(int i=(a);i>=(b);--i)#define clr(a,x) memset(a,(x),sizeof(a))#define eps 1e-8#define LL long long#define mp make_pairconst int maxn=2000+5;int h[maxn],l[maxn],r[maxn];int a[maxn][maxn];void read_int(int & x){    char ch=getchar();    while(ch<'0'||ch>'9') ch=getchar();    x=ch-'0'; ch=getchar();    while('0'<=ch&&ch<='9') {        x=x*10+ch-'0'; ch=getchar();    }}int main(){  //  freopen("in.txt","r",stdin);    int n,m;    while(scanf("%d%d",&n,&m)==2) {        rep(i,1,n+1) rep(j,1,m+1) read_int(a[i][j]);        int square=0,rect=0; clr(h,0);        rep(i,1,n+1)  {            rep(j,1,m+1)            if(a[i][j]!=a[i-1][j]) ++h[j];            else h[j]=1;            rep(j,1,m+1) l[j]=r[j]=j;            rep(j,2,m+1)            while(l[j]-1>=1&&h[l[j]-1]>=h[j]&&a[i][l[j]-1]!=a[i][l[j]]) l[j]=l[l[j]-1];            rrep(j,m-1,1)            while(r[j]+1<=m&&h[r[j]+1]>=h[j]&&a[i][r[j]+1]!=a[i][r[j]]) r[j]=r[r[j]+1];            rep(j,1,m+1) {                square=max(square,min(h[j],r[j]-l[j]+1)*min(h[j],r[j]-l[j]+1));                rect=max(rect,h[j]*(r[j]-l[j]+1));            }        }        printf("%d\n%d\n",square,rect);    }}


0 0
原创粉丝点击