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 ...
随机推荐
- vue 路由过渡动效
<router-view> 是基本的动态组件,所以我们可以用 <transition> 组件给它添加一些过渡效果: <transition name="slid ...
- Cesium案例解析(六)——3DTilesInspector监视器
目录 1. 概述 2. 案例 1. 概述 3D Tiles作为传输和渲染大规模3D地理空间数据的格式,应对的都是大规模数据的场景,Cesium提供了一个监视3D Tiles数据的监视器,可以通过这个监 ...
- JS淘宝小广告
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- 利用ARP欺骗进行MITM(中间人攻击)
ARP欺骗主要骑着信息收集得作用,比如可以利用欺骗获取对方流量,从流量分析你认为重要得信息 0X01 了解ARP Arp协议 ARP(Address Resolution Protocol,地址解析 ...
- Demrystv
Determined Energetic Motivated Reliable Yes Stick To Victory
- 硬件知识整理part3--电阻在单片机系统中的应用
邦有道,如矢:邦无道,如矢. --孔子 电阻在电路中主要功能是限流和分压等等.在单片机系统中自然也是. 电阻作为限流应该是最常用的应用之一,对于单片机外围设计来说,电阻的应用非常重要,在很多时候,我 ...
- c#中for与foreach的使用
for循环示例: static void Main(string[] args) { string[] s = new string[] { "a,b,c,d,e,f,g" }; ...
- P1341 当然是选择AC它了!(字符串处理)
A. 当然是选择AC它了! 题目描述 听闻第八届程序设计大赛马上就要开始了,已经报名的童鞋们都纷纷去 OJ 刷题.但你的女朋友 (tan90°) 想知道她写的 "A + B 问题" ...
- python笔记09
今日内容 三元运算 函数 内容详细 三元运算(三目运算) v = 前面 if 条件 else 后面 if 条件: v = '前面' else: v = '后面' # 让用户输入值,如果值是整数,则转换 ...
- 2019年3月最新可用KMS激活服务器地址
更新日期:2019/3/6 kms.03k.org kms.chinancce.com kms.lotro.cc cy2617.jios.org kms.shuax.com kms.luody.inf ...