Second Large Rectangle

题目链接(点击)

题目描述

Given a N×MN \times MN×M binary matrix. Please output the size of second large rectangle containing all "1"\texttt{"1"}"1".

Containing all "1"\texttt{"1"}"1" means that the entries of the rectangle are all "1"\texttt{"1"}"1".

A rectangle can be defined as four integers x1,y1,x2,y2x_1, y_1, x_2, y_2x1​,y1​,x2​,y2​ where 1≤x1≤x2≤N1 \leq x_1 \leq x_2 \leq N1≤x1​≤x2​≤N and 1≤y1≤y2≤M1 \leq y_1 \leq y_2 \leq M1≤y1​≤y2​≤M. Then, the rectangle is composed of all the cell (x, y) where x1≤x≤x2x_1 \leq x \leq x_2x1​≤x≤x2​ and y1≤y≤y2y_1 \leq y \leq y2y1​≤y≤y2. If all of the cell in the rectangle is "1"\texttt{"1"}"1", this is a valid rectangle.

Please find out the size of the second largest rectangle, two rectangles are different if exists a cell belonged to one of them but not belonged to the other.

输入描述:

The first line of input contains two space-separated integers N and M.

Following N lines each contains M characters cijc_{ij}cij​.

1≤N,M≤10001 \leq N, M \leq 10001≤N,M≤1000

N×M≥2N \times M \geq 2N×M≥2

cij∈"01"c_{ij} \in \texttt{"01"}cij​∈"01"

输出描述:

Output one line containing an integer representing the answer. If there are less than 2 rectangles containning all "1"\texttt{"1"}"1", output "0"\texttt{"0"}"0".

输入

  1. 1 2
  2. 01

输出

  1. 0

输入

  1. 1 3
  2. 101

输出

  1. 1

题意:

给出只包含0和1的矩形长和宽,计算出第二大全1矩阵的面积。

思路:

a.先简化成求最大全1矩阵面积:

1、对01矩阵的每一行求列(行)前缀和

2、在每一行中找每个元素的左右边界

例如:

输入矩阵:

1110

1110

0011

0011

第一步:(求列前缀和)

1110

2220

0031

0042

第二步:找左右边界(取第四行 0042 为例)

为便于观察,先画出分布图

对于图中每一个列元素,以其为高的最大矩形边长分别是:

l[1]=0,r[1]=5  S=0*(5-0-1)=0

l[2]=0,r[2]=5  S=0*(5-0-1)=0

l[3]=2,r[3]=4  S=4*(4-2-1)=4

l[1]=2,r[1]=5  S=2*(5-2-1)=4

所以最大面积为4

b.根据左右区间求出了每一行的最大面积后

可以知道 第二大矩形的面积=所有矩形中第二大的面积/最大面积的长或宽-1后相乘

具体实现:

对每一行中的列元素查找左右区间,要利用单调栈 具体讲解:单调栈

AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAX=1e3;
  4. int n,m;
  5. int high[MAX+5][MAX+5],Stack[MAX+5],l[MAX+5],r[MAX+5];
  6. char a[MAX+5][MAX+5];
  7. int cnt;
  8. int num[5*MAX*MAX+5];
  9. bool flag[MAX+5][MAX+5];
  10. int main()
  11. {
  12. scanf("%d%d",&n,&m);
  13. for(int i=0;i<n;i++){
  14. high[i][0]=-1,high[i][m+1]=-1;
  15. scanf("%s",a[i]+1);
  16. for(int j=1;j<=m;j++){
  17. if(a[i][j]=='0'){
  18. high[i][j]=0;
  19. continue;
  20. }
  21. if(i==0)
  22. high[i][j]=a[i][j]-'0';
  23. else
  24. high[i][j]=high[i-1][j]+(a[i][j]-'0');
  25. }
  26. }
  27. for(int i=0;i<n;i++){
  28. int top=0;
  29. Stack[top]=0;
  30. for(int j=1;j<=m;j++){
  31. while(high[i][Stack[top]]>=high[i][j]) top--;
  32. l[j]=Stack[top];
  33. Stack[++top]=j;
  34. }
  35. top=0;
  36. Stack[top]=m+1;
  37. for(int j=m;j>=1;j--){
  38. while(high[i][Stack[top]]>=high[i][j]) top--;
  39. r[j]=Stack[top];
  40. Stack[++top]=j;
  41. }
  42. memset(flag,false,sizeof(flag));
  43. for(int j=1;j<=m;j++){
  44. int x=r[j]-l[j]-1,y=high[i][j];
  45. if(!y) continue;
  46. if(!flag[l[j]][r[j]]){ ///标记一行中出现过的左右区间,否则同一个矩形面积会多次计算
  47. num[cnt++]=x*y;
  48. num[cnt++]=(x-1)*y;
  49. num[cnt++]=x*(y-1);
  50. flag[l[j]][r[j]]=true;
  51. }
  52. }
  53. }
  54. sort(num,num+cnt);
  55. printf("%d\n",num[cnt-2]);
  56. return 0;
  57. }
  58. /*
  59. 1 7
  60. 2145133
  61. 0 0 2 3 0 5 5
  62. 2 8 5 5 8 8 8
  63. */

Second Large Rectangle【单调栈】的更多相关文章

  1. 牛客多校第二场H Second Large Rectangle 单调栈or悬线法

    Second Large Rectangle 题意 给出n*m的01矩阵,问由1组成的第二大的矩阵的大小是多少? 分析 单调栈(or 悬线法)入门题 单调栈 预处理出每一个点的最大高度,然后单调栈每一 ...

  2. 2019 牛客暑期多校 第二场 H Second Large Rectangle (单调栈)

    题目:https://ac.nowcoder.com/acm/contest/882/H 题意:一个大的01矩阵,然后现在要求第二大的全一矩阵是多少 思路:在这里我们首先学习一下另一个东西,怎么求直方 ...

  3. leetcode Maximal Rectangle 单调栈

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4052721.html 题目链接:leetcode Maximal Rectangle 单调栈 ...

  4. poj 2559 Largest Rectangle(单调栈)

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26549 ...

  5. 2019牛客暑期多校训练营(第二场)-H Second Large Rectangle(次大子矩阵,降维,直方图+单调栈)

    题目链接:https://ac.nowcoder.com/acm/contest/882/H 题目:给n×m的由01组成的矩阵,求次大全1子矩阵的大小. 思路:第一步还是降维操作,用a[i][j]记录 ...

  6. 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)

    题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...

  7. poj 2559 Largest Rectangle in a Histogram - 单调栈

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19782 ...

  8. POJ 2559 Largest Rectangle in a Histogram(单调栈)

    传送门 Description A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...

  9. leetcode Largest Rectangle in Histogram 单调栈

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4052343.html 题目链接 leetcode Largest Rectangle in ...

随机推荐

  1. Pyqt5_QfileDialog

    QfileDialog getOpenFileName getSaveFileName getExistingDirectory getOpenFileName: 就是调用窗口来读取用户选取的文件路径 ...

  2. 快速上手Alibaba Arthas

    点击返回上层目录 原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94 Arthas 本文主要聚焦于快速上手并使用Arthas,所以对于基本的概 ...

  3. Android_适配器(adapter)之SimpleAdapter

    概述 SimpleAdapter是一种 简单的适配器,将静态数据映射到布局xml对应的视图上.它也是BaseAdapter的子类. SimpleAdapter数据映射的组件有3类(从官网api或Sim ...

  4. 【GAN】GAN设计与训练集锦

    以下内容纯属经验之谈,无公式推断!部分内容源自其他博客或课程,并已标注来源. 问题篇[1] 1.模式崩溃 在某个模式(mode)下出现大量重复样本,如左图中,生成的样本分布靠得很近,较聚集,可视化如右 ...

  5. centos7 在docker下安装mongodb

    第一步:安装 1.1 查找(查看)mongo相应的版本 [root@localhost ~]# docker search mongo INDEX NAME DESCRIPTION STARS OFF ...

  6. 【JVM】垃圾回收的四大算法

    GC垃圾回收 JVM大部分时候回收的都是新生代(伊甸区+幸存0区+幸存1区).按照回收的区域可以分成两种类型:Minor GC和Full GC(MajorGC). Minor GC:只针对新生代区域的 ...

  7. 【asp.net core 系列】2 控制器与路由的恩怨情仇

    0. 前言 在上一篇文章中,我们初步介绍了asp.net core,以及如何创建一个mvc项目.从这一篇开始,我将为大家展示asp.net core 的各种内容,并且尝试带领大家来挖掘其中的内在逻辑. ...

  8. WebAPI之FormData

    MDNformdata参考--https://developer.mozilla.org/zh-CN/docs/Web/API/FormData MDNformdata参考--https://deve ...

  9. C#中值类型,引用类型,字符串类型的区别(内存图解)

    如果用图片来解释值类型,引用类型和字符串类型(引用类型的一种)的区别的话 值类型: 引用类型: string类型:

  10. Java实现Catenyms(并查集+dfs+欧拉回路)

    Description A catenym is a pair of words separated by a period such that the last letter of the firs ...