2019牛客多校第八场A All-one Matrices 悬线法,单调栈待补
All-one Matrices
题意
对于一个n,m的01矩阵,问有多少个极大矩阵。
分析
对于悬线法来说,其过程就是枚举极大矩阵的过程,那如何计数呢?对于一个点来说,若其左右边界包含了上一个点的悬线后的连续边界,那么该点悬线出来的矩阵就被上一行的已经枚举过的矩阵所覆盖了,反之则没有覆盖cnt++,对于一行中左右同属于一个极大矩阵如何去重呢?只需要纪录一下这一行中,上一个枚举的极大矩阵的左右边界,和当前的对于一下即可。对于当前点高度为1的时候,需要进行特判去重,逻辑类似。
#include<bits/stdc++.h>
#define pb push_back
#define F first
#define S second
#define pii pair<int,int>
#define mkp make_pair
const int maxn=3000+5;
using namespace std;
int Left[maxn][maxn],Right[maxn][maxn],up[maxn][maxn];
char s[maxn][maxn];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",s[i]+1);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(s[i][j]=='1'){
Left[i][j]=Left[i][j-1]==0?j:Left[i][j-1];
up[i][j]=up[i-1][j]+1;
}
}
for(int j=m;j>=1;j--){
if(s[i][j]=='1'){
Right[i][j]=Right[i][j+1]==0?j:Right[i][j+1];
}
}
}
/* for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
{
printf("%d ",Left[i][j]);
}
puts("");
}
puts("");
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
{
printf("%d ",Right[i][j]);
}
puts("");
}
*/
int l_right=-1,l_left=-1;
int cnt=0;
for(int i=1;i<=n;i++){
l_right=-1,l_left=-1;
int l_right1=-1,l_left1=-1;
for(int j=1;j<=m;j++){
if(up[i][j]==1&&(Right[i][j]!=l_right1||Left[i][j]!=l_left1)){
//cout<<i<<" "<<j<<endl;
cnt++;
l_right1=Right[i][j];l_left1=Left[i][j];
}
else if(up[i][j]>1){
int tmpr=min(Right[i][j],Right[i-1][j]);
int tmpl=max(Left[i][j],Left[i-1][j]);
if((tmpl!=l_left||tmpr!=l_right)&&(tmpr!=Right[i-1][j]||tmpl!=Left[i-1][j])){
//cout<<i<<" "<<j<<endl;
cnt++;
l_right=tmpr;l_left=tmpl;
}
Right[i][j]=min(Right[i][j],Right[i-1][j]);
Left[i][j]=max(Left[i][j],Left[i-1][j]);
}
}
}
printf("%d\n",cnt);
return 0;
}
2019牛客多校第八场A All-one Matrices 悬线法,单调栈待补的更多相关文章
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- 2020牛客多校第八场K题
__int128(例题:2020牛客多校第八场K题) 题意: 有n道菜,第i道菜的利润为\(a_i\),且有\(b_i\)盘.你要按照下列要求给顾客上菜. 1.每位顾客至少有一道菜 2.给顾客上菜时, ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
- 2019牛客多校第四场 A meeting
链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10485 ...
- Distance(2019年牛客多校第八场D题+CDQ+树状数组)
题目链接 传送门 思路 这个题在\(BZOJ\)上有个二维平面的版本(\(BZOJ2716\)天使玩偶),不过是权限题因此就不附带链接了,我也只是在算法进阶指南上看到过,那个题的写法是\(CDQ\), ...
- Explorer(2019年牛客多校第八场E题+线段树+可撤销并查集)
题目链接 传送门 题意 给你一张无向图,每条边\(u_i,v_i\)的权值范围为\([L_i,R_i]\),要经过这条边的条件是你的容量要在\([L_i,R_i]\),现在问你你有多少种容量使得你可以 ...
- 暴力三维树状数组求曼哈顿距离求最值——牛客多校第八场D
涉及的知识点挺多,但是大多是套路 1.求曼哈顿距离的最值一般对所有情况进行讨论 2.三维树状数组用来求前缀最大值 /* 有一个三维坐标系(x,y,z),取值范围为[1,n],[1,m],[1,h],有 ...
- 2019牛客多校(第一场)F-Random Point in Triangle
#include <bits/stdc++.h> using namespace std; typedef long long ll; struct Point{ ll x, y; Poi ...
- 2019牛客多校第三场 F.Planting Trees
题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 ...
随机推荐
- 1994_An Algorithm To Reconstruct Wideband Speech From Narrowband Speech Based On Codebook Mapping
论文地址:基于码本映射的窄带语音宽带重建算法 博客作者:凌逆战 博客地址:https://www.cnblogs.com/LXP-Never/p/12144324.html 摘要 本文提出了一种从窄带 ...
- Flink中逻辑计划和物理计划的概念划分和对应关系
逻辑计划 logicGraph或者jobGraph,其端点为operator,edge为数据流向. operator往往代表一个函数. 同一个分区内的具有连续上下游关系的函数组成operator-ch ...
- npm常用命令和脚手架使用
最近前端同学使用最多的莫过于vue,angualr,react等热门前端框架了.那么就避免不掉的使用npm命令,本人就经常因为这三个脚手架的使用而不得不百度相应的npm命令,不胜其烦,,,因此就整理一 ...
- java面向对象入门(1)-入门介绍
在本 Java OOPs 概念教程中,我们将学习四种主要的面向对象原则 -- 抽象.封装.继承和多态性.它们也被称为面向对象编程范式的四大支柱. _抽象_是在不考虑无关细节的情况下公开实体基本细节的过 ...
- Windows下 JDK1.8环境配置
安装JDK1.8,安装时会安装jdk.jre. 如果只是在IDEA中写写代码,安装完jdk,在IDEA中指定jdk路径就可以了. 如果要在命令行下执行jdk的命令,比如java.javac,或者要使用 ...
- 解决Spring Security自定义filter重复执行问题
今天做项目的时候,发现每次拦截器日志都会打两遍,很纳闷,怀疑是Filter被执行了两遍.结果debug之后发现还真是!记录一下这个神奇的BUG! 问题描述 项目中使用的是Spring-security ...
- Python基础之程序暂停
当我们执行某些程序时,由于机器速度很快导致肉眼无法直接看到执行结果时程序便停止运行.这时候我们迫切需要在程序中暂停,专业术语叫做阻塞.下面列举几种常用的程序暂停方法: input()用法:直接在欲等待 ...
- Elasticsearch配置集群环境
环境选择: 1.方案一:准备三台机器 每一台机器一个节点 2.方案二:准备一台机器 启动三个节点,用端口号区分即可 3.ES启 ...
- linux命令——find
简介:find是Linux系统中的常用命令(应用程序)之一.它是用来在指定目录层次结构(指定目录的子目录以及子目录的子目录)中查找符合指定条件的文件和目录 一:语法结构 find [directory ...
- 本地服务开启MySQL57提示本地计算机上MySQL服务启动后停止。。。。
1.首先以管理员身份启动cmd,要不然服务禁止访问. 2.然后在cmd中输入 mysqld --remove mysql或者mysqld --remove mysql57来移除服务. 3.然后进入My ...