2019牛客多校A All-one Matrices——单调栈
题目
求非嵌套子矩阵的个数。
分析
单调栈的套路题(类似的有求最大子矩阵)。
首先,按列预处理,每个位置化成连续1的个数。
例如,左边的图转成右边。

然后枚举每一行作为矩阵的底边,再从前往后枚举每一列,并维护一个关于高度的单调上升的栈。对于栈中每一个Up值,还需要维护一个其向左能拓展的最远位置Left(其实这个很容易实现,只需用一个普通的栈并与单调栈同步,同入同出)。
那么每当有元素退栈时,设退栈元素为 (Up, Left),那么可以得到一个全1矩阵 (i-Up+1, Left) - (i, j)。
还需要判断这个矩阵能否会被更大的矩形嵌套,随便用一种方法判断一下。例如,用 C[left] [right] 表示以 left-right 为宽的矩形延伸到了哪一行。
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn = + ;
int n, m, A[maxn][maxn], B[maxn][maxn], C[maxn][maxn];
char s[maxn]; int main()
{
scanf("%d%d", &n, &m);
for(int i = ;i < n;i++)
{
scanf("%s", s);
for(int j = ;j < m;j++) A[i+][j+] = s[j] - '';
}
for(int j = ;j <= m;j++)
for(int i = ;i <= n;i++)
{
if(A[i][j] == ) B[i][j] = B[i-][j] + ;
else B[i][j] = ;
} ll ans = ;
memset(C, -, sizeof(C));
for(int i = ;i <= n;i++)
{
stack<int>st1, st2;
for(int j = ;j <= m+;j++)
{
int left = j;
while(!st1.empty() && B[i][j] < st1.top())
{
if(C[st2.top()][j] != i - ) ans++; //与上一层不是同一个最大矩形时
C[st2.top()][j] = i;
st1.pop();
left = st2.top();
st2.pop();
} if((st1.empty() && B[i][j] != ) || (!st1.empty() && B[i][j] > st1.top()))
{
st1.push(B[i][j]);
st2.push(left);
}
}
}
printf("%lld\n", ans);
return ;
}
参考链接: https://blog.csdn.net/zuzhiang/article/details/78693421
2019牛客多校A All-one Matrices——单调栈的更多相关文章
- 2019牛客多校第四场C-sequence(单调栈+线段树)
sequence 题目传送门 解题思路 用单调栈求出每个a[i]作为最小值的最大范围.对于每个a[i],我们都要乘以一个以a[i]为区间内最小值的对应的b的区间和s,如果a[i] > 0,则s要 ...
- 2019牛客多校第一场 I Points Division(动态规划+线段树)
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...
- 2019牛客多校第二场 A Eddy Walker(概率推公式)
2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- 2019牛客多校 Round4
Solved:3 Rank:331 B xor 题意:5e4个集合 每个集合最多32个数 5e4个询问 询问l到r个集合是不是都有一个子集的xor和等于x 题解:在牛客多校第一场学了线性基 然后这个题 ...
- 2019牛客多校第一场E ABBA(DP)题解
链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...
- 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 ...
- [2019牛客多校第二场][G. Polygons]
题目链接:https://ac.nowcoder.com/acm/contest/882/G 题目大意:有\(n\)条直线将平面分成若干个区域,要求处理\(m\)次询问:求第\(q\)大的区域面积.保 ...
- 2019 牛客多校第一场 D Parity of Tuples
题目链接:https://ac.nowcoder.com/acm/contest/881/D 看此博客之前请先参阅吕凯飞的论文<集合幂级数的性质与应用及其快速算法>,论文中很多符号会被本文 ...
随机推荐
- [bzoj4345][POI2016]Korale_堆_贪心_线段树_dfs
bzoj4345 POI2016 Korale 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4345 数据范围:略. 题解: 由于$k$的范围问 ...
- IIS清理缓存
服务器突然断电经常会导致IIS中web项目运行不起来问题,各种报XXXX.dll加载失败,解决方法重新发布,如果重新发布也不行可能就是IIS缓存的问题了. 清理IIS缓存方法: 进入以下文件夹吧对应的 ...
- 机器学习之主成分分析PCA原理笔记
1. 相关背景 在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律.多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的 ...
- TCP(上)
tcp头格式: TCP状态位: SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DATA数据传输, RST表示连接重置. TCP窗口: TCP 要做流量控制,通信双方各声明 ...
- 在论坛中出现的比较难的sql问题:25(字符串拆分3)
原文:在论坛中出现的比较难的sql问题:25(字符串拆分3) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必要记录下 ...
- C#操作Windows控制面板
先介绍一下Windows控制面板的一些操作,再介绍如何用C#语言来操作控制面板. 1.如何快速打开控制面板中的项目: 运行输入(大小写不敏感) control system 打开系统信息 contro ...
- C# 、子窗体调用父窗体属性、方法
namespace Test { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } p ...
- 【转载】IIS网站如何同时解析带www和不带www的域名
针对公网上线的网站系统,很多网站的域名会同时含有带www和不带www的域名解析记录,如果需要同时解析带www和不带www的域名信息,则需要在相应的域名解析平台(如阿里云域名解析平台.腾讯云域名解析平台 ...
- display的属性
在一般的CSS布局制作时候,我们常常会用到display对应值有block.none.inline这三个值.,display这个属性用于定义建立布局时元素生成的显示框类型.对于 HTML 等文档类型, ...
- Python 自己实现可迭代对象
import time from collections import Iterable from collections import Iterator class Classmate(object ...