当前位置: 首页 > news >正文

POJ - 3494 Largest Submatrix of All 1’s(单调栈+降维)

传送门


这题开始知道是用单调栈做,然后我一开始想的是先求出每个 1 1 1最右边最后一个 1 1 1也就是第一个小于它的数;同理求出最下面的第一个小于它的数。这样我们枚举每一个 1 1 1作为矩形的左上角然后想办法求出每行的最小的,然后每行的每个位置上下最小的似乎又要用单调栈做,这也太麻烦了,没有心思写下去了想去看看正解

实际上是化二维为一维,对于某一行或者某一列来说,我们完全可以看做它下面连续的一块 1 1 1累加而来形成一个高度,这样问题就变成了这种一维的高度求某块的最大矩形区域的问题:
在这里插入图片描述
因此我们将每列从上到下累加,然后枚举每一行,接着分别从右向左以及从左向右找到该位置数作为区间最小值的左界和右界,这样每次更新答案即可

#include <math.h>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ins insert
#define Vector Point
#define lowbit(x) (x&(-x))
#define mkp(x,y) make_pair(x,y)
#define mem(a,x) memset(a,x,sizeof a);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
const double eps=1e-8;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const double dinf=1e300;
const ll INF=1e18;
const int Mod=1e9+7;
const int maxn=2020;

int a[maxn][maxn];
int st[maxn],R[maxn];
int n,m;

int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    //ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    while(~scanf("%d%d",&n,&m)){
        memset(a,0,sizeof a);
        for(int i=1,x;i<=n;i++){
            for(int j=1;j<=m;j++){
                scanf("%d",&x);
                if(x) a[i][j]=a[i-1][j]+1;
            }
            a[i][0]=a[i][m+1]=-inf;
        }
        int head,l,ans=0;
        for(int i=1;i<=n;i++){
            head=0;
            st[head++]=m+1;
            for(int j=m;j>=1;j--){
                while(a[i][st[head-1]]>=a[i][j]) head--;
                R[j]=st[head-1]-1;
                st[head++]=j;
            }
            head=0;
            st[head++]=0;
            for(int j=1;j<=m;j++){
                while(a[i][st[head-1]]>=a[i][j]) head--;
                l=st[head-1]+1;
                ans=max(ans,a[i][j]*(R[j]-l+1));
                st[head++]=j;
            }
        }
        printf("%d\n",ans);
    }

    return 0;
}

相关文章:

  • 在批处理文件中实现按日期命名的目录迁移
  • HDU - 6806 Equal Sentences(dp)
  • UltraWinGrid自适应列宽/行高
  • HDU - 6812 Kindergarten Physics(分块/规律)
  • UltraGrid 卡片模式列自适应宽度
  • 2020牛客暑期多校第七场 B - Mask Allocation(思维)
  • 编程修改BIN等二进制文件
  • 2020牛客暑期多校第七场 H - Dividing(整除分块)
  • 2020牛客暑期多校第八场 K - Kabaleo Lite(贪心)
  • 什么是程序员正确的职场心态?
  • 2020牛客暑期多校第八场 I - Interesting Computer Game(并查集+离散化)
  • [J2ME]url请求返回参数非法(java.lang.illegalArgument)
  • 如果将OpenGL的MVP矩阵设置为单位阵
  • 2020智算之道复赛 C - 有向无环图(思维+二进制拆分)
  • 技术人生
  • CODING 缺陷管理功能正式开始公测
  • E-HPC支持多队列管理和自动伸缩
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 复杂数据处理
  • 三分钟教你同步 Visual Studio Code 设置
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • mysql面试题分组并合并列
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • (arch)linux 转换文件编码格式
  • (理论篇)httpmoudle和httphandler一览
  • (十八)SpringBoot之发送QQ邮件
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (正则)提取页面里的img标签
  • (转)负载均衡,回话保持,cookie
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET企业级应用架构设计系列之技术选型
  • /etc/motd and /etc/issue
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [AIGC codze] Kafka 的 rebalance 机制
  • [Bugku]密码???[writeup]
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [CF]Codeforces Round #551 (Div. 2)
  • [cogs2652]秘术「天文密葬法」
  • [C语言]——柔性数组
  • [docker] Docker的数据卷、数据卷容器,容器互联
  • [Java开发之路](14)反射机制
  • [JS]Math.random()随机数的二三事
  • [LeetCode]—Permutations II 求全排列(有重复值)
  • [Noi2015]程序自动分析
  • [office] excel中weekday函数的使用方法 #学习方法#微信#媒体
  • [PyTorch][chapter 60][强化学习-2-有模型学习2]
  • [Raspberry Pi] Raspberry Pi 4配置OpenCV4.6.0和ncnn环境(32-bit operation system)
  • [RK3568 Android11] Input UI 使用流程