2019牛客暑期多校训练营(第八场)A-All-one Matrices(单调栈+思维)
题意:给你一个01矩阵,求出所有不可扩大的全为1的矩阵的个数
思路:比赛的时候想到了用单调栈,但是也只是想到了,并不知道怎么用,其实和之前求二维01矩阵中全为1的矩阵最大面积非常相像。
像到什么地步呢!!你想一个不能扩大的矩阵,也即是说不能向左右扩展,也不能向上扩展,那我们就用单调栈维护每一行中每个点能向上扩展的最大高度h。
目前到这里都和二位01矩阵求最大面积的解法一模一样!!接下来我们只需要判断这个矩阵能不能向下扩展就行了,对吧。这里我们就用数组记录一下,如果能向下扩展就记为1,不能就记为0,最后判断,这个矩阵向左右扩展的最大区间宽度是否大与向下扩展的宽度,如果大与的话就不能向下扩展。
最后还有一个问题,不知道有没有发现,假如我在同一行两次查找到的矩阵是同一矩阵,那怎么办?
这个时候就涉及到去重的问题了,仔细观察一下,会发现同一高度的h值在出栈计算得到的矩形是一样的(因为高度相同的肯定能互相扩展),所以高度相同的只用计算一次就好了。我们比较一下弹出的元素和栈顶元素的h值,如果相同就代表高度相同就不能取。
Code
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3005; int n, m, t, ans;
int a[maxn][maxn];
int st[maxn], h[maxn], dn[maxn];
char c[maxn];
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%s", c+1);
for (int j = 1; j <= m; j++) a[i][j] = c[j]-'0';
}
for (int i = 1; i <= n; i++) {
int t = 0; //t表示栈顶
for (int j = 1; j <= m + 1; j++) {
h[j] = a[i][j] ? h[j] + 1 : 0; //向上能扩展的最大高度
dn[j] = dn[j - 1] + a[i + 1][j]; //是某能向下扩展的前缀和
while (h[j]<h[st[t]]) {
int width = j-1-st[t-1], num = dn[j-1]-dn[st[t-1]]; //width表示能向左右扩展的最大宽度,num表示其中共有几个能够向下扩展
ans += (num<width&&h[st[t-1]]<h[st[t]]); //判断是否满足条件并去重
t--;
}
st[++t] = j;
}
}
printf("%d\n", ans);
return 0;
}
2019牛客暑期多校训练营(第八场)A-All-one Matrices(单调栈+思维)的更多相关文章
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
- 2019牛客暑期多校训练营(第一场) - A - Equivalent Prefixes - 单调栈
A - Equivalent Prefixes - 单调栈 题意:给定两个n个元素的数组a,b,它们的前p个元素构成的数组是"等价"的,求p的最大值."等价"的 ...
- 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)
题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9: 对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可. 后者mod=1e9,5才 ...
- 2019牛客暑期多校训练营(第一场) B Integration (数学)
链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...
- 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...
- 2019牛客暑期多校训练营(第二场)F.Partition problem
链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...
- 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...
- [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem
链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 2019牛客暑期多校训练营(第一场)-A (单调栈)
题目链接:https://ac.nowcoder.com/acm/contest/881/A 题意:给定两个长度均为n的数组a和b,求最大的p使得(a1,ap)和(b1,bp)等价,等价的定义为其任意 ...
- 2019牛客暑期多校训练营(第一场)A - Equivalent Prefixes(单调栈)
题意 给定两个$n$个元素的数组$a,b$,它们的前$p$个元素构成的数组是"等价"的,求$p$的最大值."等价"的意思是在其任意一个子区间内的最小值相同. $ ...
随机推荐
- Termux键盘配置
通过编辑~/.termux/termux.properties配置 extra-keys = [\ ['ESC', 'CTRL', '&', '$', '!', '%', '<', '& ...
- Web Service 服务无法连接Oracle数据库
这个问题之前部署就遇到过,但是后来忘了,所以记录一下吧. 我部署Web Service服务的时候,服务没法正常运行,与Oracle数据库无法正常通信. 检查了数据库连接字没有任何问题,写了个测试接口, ...
- WebApi 中请求的 JSON 数据字段作为 POST 参数传入
使用 POST 方式请求 JSON 数据到服务器 WebAPI 接口时需要将 JSON 格式封装成数据模型接收参数.即使参数较少,每个接口仍然需要单独创建模型接收.下面方法实现了将 JSON 参数中的 ...
- 【Flutter】可滚动组件简介
前言 当组件内容超过当前显示视口(ViewPort)时,如果没有特殊处理,Flutter则会提示Overflow错误.为此,Flutter提供了多种可滚动组件(Scrollable Widget)用于 ...
- 一. SpringCloud简介与微服务架构
1. 微服务架构 1.1 微服务架构理解 微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦.你可以将其看作是在 ...
- [WPF] 在单元测试中使用 Prism 的 EventAggregator,订阅到 ThreadOption.UIThread 会报错
1. 问题 [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { ContainerLocator ...
- 通过js给某个标签添加内容或者删除标签
添加内容 //先保存div中原来的html var tag = document.getElementById("tag").innerHTML; //构造新的内容 var cou ...
- tf
第2章 Tensorflow keras实战 2-0 写在课程之前 课程代码的Tensorflow版本 大部分代码是tensorflow2.0的 课程以tf.kerasAPI为主,因而部分代码可以在t ...
- 相对论中的光速c不变,这么讲!你总能理解了吧!
今天谈谈相对论的假设基础--光速不变,很多人都知道爱因斯坦的相对论,也知道相对论的理论基础是光速不变,即无论参考哪个参照系,光的速度都是不变的,这个很难得理解的问题.我之前看过别人的理解,也自己思考怎 ...
- The WebSocket Protocol 1000
https://tools.ietf.org/html/rfc6455 https://tools.ietf.org/html/rfc6455 7.4.1. Defined Status Codes ...