Second Large Rectangle
题意:从一个01矩阵里面找到全是1的第二大的矩形面积。
思路:悬线法求最大的标记一下,第二大的就容易求出来了。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int a[maxn][maxn];
int vis[maxn][maxn];
int h[maxn],l[maxn],r[maxn];
int n,m;
int main(){
char s;
int ans1=0,ans2=0;
memset(a,0,sizeof(a));
memset(h,0,sizeof(h));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>s,a[i][j]=s-'0';
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++){
if(a[i][j])
h[j]++;
else h[j]=0;
}
for(int j=1;j<=m;j++)
{
l[j]=j;
while(l[j]>1&&h[j]<=h[l[j]-1]) {
l[j]=l[l[j]-1];
}
}
for(int j=m;j>=1;j--)
{
r[j]=j;
while(r[j]<m&&h[j]<=h[r[j]+1]){
r[j]=r[r[j]+1];
}
}
for(int j=1;j<=m;j++){
if(a[i][j]==0)
continue;
int ll=l[j],rr=r[j];
if(vis[ll][rr]==i)
continue;
vis[ll][rr]=i;
ans2=max(ans2,h[j]*(rr-ll+1));
if(ans2>ans1)
swap(ans2,ans1);
ans2=max(ans2,h[j]*(rr-ll));
if(ans2>ans1)
swap(ans2,ans1);
ans2=max(ans2,(h[j]-1)*(rr-ll+1));
if(ans2>ans1)
swap(ans2,ans1);
}
}
printf("%d\n",ans2);
return 0;
}