2019 牛客暑期多校 第八场 A All-one Matrices (单调栈+前缀和)
时间:2019-08-11
本文章向大家介绍2019 牛客暑期多校 第八场 A All-one Matrices (单调栈+前缀和),主要包括2019 牛客暑期多校 第八场 A All-one Matrices (单调栈+前缀和)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:https://ac.nowcoder.com/acm/contest/888/A
题意:找全1矩阵的个数,并且这个全1矩阵不被其他全1矩阵包含
思路:这里引用付队说的话
-> {
这类问题,一般解决就是两个方向:
A:压缩一维,即枚举上下边界,然后复杂度O(N^3);
B:广告牌问题,即枚举下边界s,那么久可以看成s为底的一些高楼,再高楼上布置广告牌,复杂度O(N^2)。
}
这里光看复杂度我们就能看出肯定是B类问题,我们之前已经知道怎么求出每个矩阵了,但是我们怎么确定他是最大不可延伸的矩阵了呢,其实我们无非就是看当前矩阵是否还可以向上下左右延申,左右的话我们之前看过dp和栈的做法能找出L[i],R[i],我们本来就是从上往下来枚举的,上面延申已经不用考虑,我们预处理出来了,我们以当前层为底时怎么确定下面是否可以再延申呢。我们只要看下下面这行是否全部都是1即可,那么如何确定呢,前缀和判断是否等于区间长度,这样就可以了,如果等于说明可以再延申,如果不可以,矩形数+1
#include<bits/stdc++.h> #define maxn 3005 #define mod 1000000007 using namespace std; typedef int ll; ll n,m; char str[maxn][maxn]; ll dp[maxn][maxn]; int vis[maxn][maxn]; ll r[maxn],l[maxn],sum[maxn]; ll cnt; ll q[maxn],head; void get(int t){ head=0;q[++head]=0; for(int i=1;i<=m;i++){ while(head>0&&dp[t][i]<=dp[t][q[head]]) head--; l[i]=q[head]+1; q[++head]=i; } head=0;q[++head]=m+1; for(int i=m;i>=1;i--){ while(head>0&&dp[t][i]<=dp[t][q[head]]) head--; r[i]=q[head]-1; q[++head]=i; } for(int i=1;i<=m;i++) sum[i]=sum[i-1]+(str[t+1][i]=='1'); for(int i=1;i<=m;i++){ if(dp[t][i]==0) continue; if(vis[l[i]][r[i]]==t) continue; if(sum[r[i]]-sum[l[i]-1]==r[i]-l[i]+1) continue; cnt++; vis[l[i]][r[i]]=t; } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%s",str[i]+1); } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(str[i][j]=='1'){ dp[i][j]=dp[i-1][j]+1; } else dp[i][j]=0; } } for(int i=1;i<=n;i++){ get(i); } printf("%d",cnt); return 0; }
原文地址:https://www.cnblogs.com/Lis-/p/11335043.html
- 用Java实现处理日期的工具类——常用日期处理方法
- ORM查询语言(OQL)简介--实例篇
- 漏洞预警 | 海洋CMS(SEACMS)0day漏洞预警
- 【机器学习】分类算法评价
- Java中图片处理工具类——能满足各种需求
- onclicklistener到底怎么用?
- 如何入侵联网智能灯泡——LIFX智能灯泡
- Java实现的一个编号生成器工具类——5种方法
- 【机器学习】有趣的机器学习:最简明入门指南
- 不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD
- 海量数据处理利器之布隆过滤器
- ORM查询语言(OQL)简介--概念篇
- Discuz! 任意文件删除漏洞重现及分析
- .NET DLR 上的IronScheme 语言互操作&&IronScheme控制台输入中文的问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【tensorflow2.0】AutoGraph的使用规范
- django-个人网站之环境配置(一)
- 用C++跟你聊聊“职责链模式”
- django-常见问题勘误
- 【tensorflow2.0】AutoGraph和tf.Module
- mybatis之第一个mybatis程序(二)
- mybatis-spring整合的三种(逐渐优化)方案
- 用C++跟你聊聊“命令模式”,跟我聊就够了
- 【tensorflow2.0】数据管道dataset
- 用C++跟你聊聊“桥接模式”
- 用C++跟你聊聊“单例模式”,类的“计划生育”
- django-HttpResponse,render,redirect
- django-ForeignKey,OneToOneField,ManyToManyField
- 用C++跟你聊聊“备忘录模式” ,如果能重来,我要···
- 数据库(一)--通过django创建数据库表并填充数据