题目链接:https://ac.nowcoder.com/acm/contest/882/H

题目:给n×m的由01组成的矩阵,求次大全1子矩阵的大小。

思路:第一步还是降维操作,用a[i][j]记录以第i行为底的全1直方图的高,如对于矩阵:

    
    
    
    

   其矩阵a为:

    
    
    
    

   之后对于每一行的所有列用单调栈维护每个数左/右边第一个比它小的值的下标,则以a[i][j]为高的矩阵最大为(r[j]-l[j]+1)×a[i][j],然后维护更新max1,max2即可。

   需要注意的是,max1维护最大矩阵的大小,max2维护次大矩阵的大小,mx、my维护最大矩阵的右下角下标,xx、yy维护最大矩阵的长和宽,若当前面积值>=max1,需要比较是否是同一个矩阵(by mx、my、xx、yy是否相等来比较),若是,则不能更新max2=max1,否则,即不是一个矩阵,则可以max2=max1.

AC代码:

#include<cstdio>
#include<algorithm>
using namespace std; int n,m,p1,p2,max1,max2;
int a[][],stk1[],stk2[];
int l[],r[];
char s[];
int mx,my,xx,yy; int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i){
a[i][]=-,a[i][m+]=-;
scanf("%s",s);
for(int j=;j<=m;++j){
int tmp=s[j-]-'';
if(tmp) a[i][j]=a[i-][j]+;
}
}
stk1[]=,stk2[]=m+;
for(int i=;i<=n;++i){
p1=p2=;
for(int j=;j<=m;++j){
while(a[i][stk1[p1-]]>=a[i][j]) --p1;
l[j]=stk1[p1-];
stk1[p1++]=j;
}
for(int j=m;j>=;--j){
while(a[i][stk2[p2-]]>=a[i][j]) --p2;
r[j]=stk2[p2-];
stk2[p2++]=j;
}
for(int j=;j<=m;++j){
int x=r[j]-l[j]-,y=a[i][j];
if(!y) continue;
int aa=i,bb=r[j]-;
if(x*y>=max1){
if(!(aa==mx&&bb==my&&x==xx&&y==yy))
max2=max1;
max1=x*y,mx=aa,my=bb,xx=x,yy=y;
}
else if(x*y>max2)
max2=x*y;
max2=max(max2,max((x-)*y,x*(y-)));
}
}
printf("%d\n",max2);
return ;
}

最新文章

  1. android模拟器停在Waiting for HOME解决方案
  2. DOM--4 响应用户操作和事件(2)
  3. ViewState与Session
  4. H5版俄罗斯方块(5)---需求演进和产品迭代
  5. CocoStudio基础教程(5)使用CocoStudio场景编辑器关联组件
  6. Spring mvc中使用request和response
  7. Groovy选型
  8. c#winform音乐制作软件
  9. AudioStreamer使用之快速点击下/上一首按钮,音频会重复的问题解决。
  10. HDU 1051 - Rightmost Digit
  11. Hadoop 7、MapReduce执行环境配置
  12. JSON反序列化实体类
  13. 移动web开发学习笔记一
  14. js 计算月/周的第一天和最后一天
  15. python&gt;oop
  16. Android View底层到底是怎么绘制的
  17. Linux 的umask详解
  18. Hadoop记录-技术网站
  19. (网页)JS实现alert中显示换行的方法
  20. 阿里巴巴Web前端面试的一道JS题目,求解答!!!

热门文章

  1. [CTF]Heap vuln -- unlink
  2. XML -- 为什么选择XML?
  3. HZOJ 20190719 那一天她离我而去(图论最小环)
  4. Java当中的IO流(上)
  5. js监听transition过渡事件
  6. kubectl管理kubernetes集群
  7. docker Tomcat镜像
  8. 《SVG精髓》笔记(二)
  9. Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/Cppcc] due to a StackOverflowError. Possible root causes include a too low setting for -Xs
  10. Python 之目录处理