2019牛客暑期多校训练营(第八场)-A All-one Matrices (单调栈+前缀和)
题目链接:https://ac.nowcoder.com/acm/contest/888/A
题意:给n×m的01矩阵,求出其中全为1的矩阵个数(不被其它全1矩阵包括)。
思路:和第二场多校的次大子矩阵类似。二维降一维,遍历行,以第i行为矩阵的底,通过单调栈得到矩阵向左向右能够扩展的范围 l[j]和r[j],然后关键在去重。有两种重复,第一种是同一行中的矩阵,可以用二维矩阵vis[l[j]][r[j]]标记此范围的矩阵已被记录。对于列的重复,是因为此时的矩阵能在下一行得到行扩展,所以预处理得到下一行的‘1’个数的前缀和num[j],通过判断num[r[j]-1]-num[l[j]]==r[j]-l[j]-1来判断是否能扩展到下一行,能的话当前不记录。
AC代码:
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn=;
int n,m,ans;
int a[maxn][maxn],stk1[maxn],stk2[maxn];
int l[maxn],r[maxn],num[maxn],vis[maxn][maxn];
char c[maxn][maxn]; int main(){
scanf("%d%d",&n,&m);
for(register int i=;i<=n;++i){
a[i][]=a[i][m+]=-;
scanf("%s",c[i]+);
for(register int j=;j<=m;++j){
register int tmp=c[i][j]-'';
if(tmp) a[i][j]=a[i-][j]+;
}
}
stk1[]=,stk2[]=m+;
for(register int i=;i<=n;++i){
register int p1=,p2=;
for(register int j=;j<=m;++j){
while(a[i][stk1[p1-]]>=a[i][j]) --p1;
l[j]=stk1[p1-];
stk1[p1++]=j;
}
for(register 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)
num[j]=num[j-]+(c[i+][j]=='');
for(register int j=;j<=m;++j){
if(!a[i][j]) continue;
if(vis[l[j]+][r[j]-]==i) continue;
if(num[r[j]-]-num[l[j]]==r[j]-l[j]-) continue;
++ans;
vis[l[j]+][r[j]-]=i;
}
}
printf("%d\n",ans);
return ;
}
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$的最大值."等价"的意思是在其任意一个子区间内的最小值相同. $ ...
随机推荐
- 使用ice-plugin-fusion给icedesign的模板加个主题(theme)
最近一直处于半失业状态,好多年没有更新对前端的理解了,闲来看看前端技术的发展.因为一直是个草台班子,身兼多职东看看西看看,一直没太搞清楚iceworks.ant design, fusion等等一堆阿 ...
- codeforces708C
CF708C Centroids 题意翻译 给定一颗树,你有一次将树改造的机会,改造的意思是删去一条边,再加入一条边,保证改造后还是一棵树. 请问有多少点可以通过改造,成为这颗树的中心?(如果以某个点 ...
- JVM——内存结构
一.程序计数器/PC寄存器 (Program Counter Registe) 用于保存当前正在执行的程序的内存地址(下一条jvm指令的执行地址),由于Java是支持多线程执行的,所以程序执行的轨迹不 ...
- 如何写出好的PRD(产品需求文档)(转)
作者:Cherry,2007年进入腾讯公司,一直从事互联网广告产品管理工作,目前在SNG/效果广告平台部从事效果广告的产品运营工作. PRD(Product Requirement Document, ...
- Mybatis源码学习之类型转换(四)
简述 JDBC数据类型与Java语言中的数据类型并不是完全对应的,所以在PreparedStatement为SQL语句绑定参数时,需要从Java类型转换成JDBC类型,而从结果集中获取数据时,则需要从 ...
- 0ctf-Wallbreaker Easy复现
补坑+1. 有预留的后门,并且给了phpinfo,因此可以从phpinfo中先搜集一波信息: 这里禁用了很多命令执行的函数,所以应该要bypass_disablefunction,先读一下flag在哪 ...
- mui.toast样式风格及位置修改教程
mui.toast样式风格及位置修改教程 使用了mui.toast来实现可自动消失的信息提示效果. 但默认的显示效果太差了,很不显示,而且是在底部的. 如下图: 想改到屏幕的中间位置,再改大一点. 但 ...
- 【MyBatis】【SQL】删除最快纪录诞生,从一千万条记录中删除八百万条仅用2分6秒
在 https://www.cnblogs.com/xiandedanteng/p/11669629.html 里我做个一个循环按时间查ID并删除之的程序,运行时间是4分7秒. 但是这个程序走了很多次 ...
- 1.Json的学习--JSON.stringfy()
1.JSON.parse() JSON.parse() JSON 通常用于与服务端交换数据. 在接收服务器数据时一般是字符串. 我们可以使用 JSON.parse() 方法将数据转换为 JavaScr ...
- 图解Python 【第五篇】:面向对象-类-初级基础篇
由于类的内容比较多,分为类-初级基础篇和类-进阶篇 类的内容总览图: 本节主要讲基础和面向对象的特性 本节内容一览图: 前言总结介绍: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 ...