黑暗爆炸OJ#1057. [ZJOI2007]棋盤製作(懸線法)
阿新 • • 發佈:2021-07-28
https://darkbzoj.tk/problem/1057
這個與有障礙格子的懸線法有一點區別
當親格子不能延續時,當前格子依然有用
#include<bits/stdc++.h> using namespace std; #define N 2003 int a[N][N]; int h[N],l[N],r[N]; int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) scanf(作者:xxy 出處:http://www.cnblogs.com/TheRoadToTheGold/ 本文版權歸作者和部落格園共有,轉載請用連結,請勿原文轉載,Thanks♪(・ω・)ノ。"%d",&a[i][j]); for(int i=1;i<=m;++i) { a[0][i]=-1; l[i]=1; r[i]=m; } for(int i=1;i<=n;++i) a[i][0]=a[i][m+1]=-1; int t1=0,t2=0,L,R; for(int i=1;i<=n;++i) { L=0; for(int j=1;j<=m;++j) if(a[i][j]!=a[i-1][j] && a[i][j]!=a[i][j+1] && a[i][j]!=a[i][j-1]) ++h[j]; else h[j]=1; for(int j=1;j<=m;++j) if(a[i][j]!=a[i-1][j] && a[i][j]!=a[i][j-1]) l[j]=max(l[j],L); else { l[j]=1; L=j; } R=m+1; for(intj=m;j;--j) if(a[i][j]!=a[i-1][j] && a[i][j]!=a[i][j+1]) r[j]=min(r[j],R); else { r[j]=m; R=j; } for(int j=1;j<=m;++j) { t2=max(t2,(r[j]-l[j]+1)*h[j]); t1=max(t1,min(r[j]-l[j]+1,h[j])*min(r[j]-l[j]+1,h[j])); } } printf("%d\n%d",t1,t2); }