矩形统计【单调栈】

矩形个数问题(单调栈) 题目传送门 首先我们了解一下什么是单调栈(不过神犇们都应该会了) 1.定义 单调栈是一种可以以 O(n) 的时间复杂度解决类似求数组中某个位置i往左(或往右)第一个比i这个位置大(或小)的数(或位置)的问题的算法。 2.怎么做? 首先定义一个栈(先进后出)栈中存的是目前还没有答案的数,易得栈中元素递减(不然与栈的定义不符),对于每一次要将元素压入栈,先将栈顶所有大于它的元素记录答案(就是要压入的元素)并弹出,因为我们要求左边第一个,所以以从右向左的顺序入栈(因为是先入栈再记录答案,所以要从元素从答案入栈) 阅读详情

题目大意:

题目链接:http://10.156.31.134/contestnew.aspx?cid=128
求一个 n × m n\times m n×m的矩阵中选出小矩形的方案数,其中一部分格子不可以选。两个矩形不同定义为两个矩形大小不同或位置不同。


思路:

考虑使用容斥,答案即为总方案数减去选择了若干不可以选的格子的方案数。
总方案数非常简单,枚举矩形的右下端点,显然位于该点左上方的任意点均可与该点组成一个矩形。所以对于点 ( i , j ) (i,j) (i,j)一共有 i × j i\times j i×j中选法。
所以总方案数即为 ∑ i = 1 n ∑ j = 1 m i j \sum^{n}_{i=1}\sum^{m}_{j=1}ij ∑i=1n​∑j=1m​ij。
那么考虑选择若干坏点的方案数。依然枚举一个右下端点 ( i , j ) (i,j) (i,j),那么一个坏点可以对这个点产生贡献的充分条件即为该坏点位于端点的左上方。
同时,如果两个坏点 ( x 1 , y 1 ) ( x 2 , y 2 ) (x1,y1)(x2,y2) (x1,y1)(x2,y2)均满足上述条件,但是有 x 1 ≤ x 2 x1\leq x2 x1≤x2且 y 1 ≤ y 2 y1\leq y2 y1≤y2,那么显然 ( x 1 , y 1 ) (x1,y1) (x1,y1)被 ( x 2 , y 2 ) (x2,y2) (x2,y2)完全包含住了,所以 ( x 1 , y 1 ) (x1,y1) (x1,y1)依然不可以对这个点产生贡献。
所以我们发现满足条件的坏点在横坐标单调递增的前提下一定满足纵坐标是单调递减的,否则必然存在产生不了贡献的点。
所以对于每一列维护一下能产生贡献的点集,利用求解即可。


代码:

#include <stack>
#include <cstdio>
using namespace std;
typedef long long ll;

const int N=1010;
ll maxn,sum,last[N][N],f[N][N];
int n,a[N][N];
stack<ll> s[N];

int main()
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
			scanf("%1d",&a[i][j]);
	for (int i=1;i<=n;i++)
		s[i].push(0);
	for (ll i=1;i<=n;i++)
		for (ll j=1;j<=n;j++)
		{
			if (a[i][j]) last[i][j]=j;
				else last[i][j]=last[i][j-1];
			while (s[j].size()>1 && last[s[j].top()][j]<last[i][j]) s[j].pop();
			maxn+=i*j;
			f[i][j]=f[s[j].top()][j]+(i-s[j].top())*last[i][j];
			sum+=f[i][j];
			s[j].push(i);
		}
	printf("%lld\n",maxn-sum);
	return 0;
}
数据结构之单调栈、单调队列 这段代码使用了两个单调队列来记录最大值和最小值的索引,在滑动窗口的过程中寻找满足条件的子序列,并记录其长度。这一道题目需要仔细的理解单调队列在其中的运用,请读者仔细领悟与思考。定义:队列中的元素按照递增或者递减的线性关系排列的队列。上面的代码我附着了详细的讲解。第三题的难度较大:数对统计。 阅读详情

相关推荐

C#开发者必备:VSPD虚拟串口快速配置指南(附汉化教程)

本文为C#开发者提供了VSPD虚拟串口的快速配置与汉化教程。详细介绍了如何安装、汉化VSPD,并创建稳定的虚拟串口对,重点讲解了如何将其集成到C#开发工作流中,使用SerialPort类进行数据通信测试、协议模拟及故障排查,有效提升硬件通信开发的效率。

weixin_29224529的博客 256

单调栈解决取矩形问题

单调栈解决取矩形问题 ​ 前言:这一类问题不知道是什么问题,emmm大概意思就是从一个混合着可行点和不可行点的矩形中能取出的充满可行点的矩形的数目。这一类问题应该有一个官方的名字,大家如果知道可以在评论区中给出。 一 思想概括 对于这样的一个数据,其中1为可行点,求最多能得到多少个矩形 1 0 1 0 1 1 1 0 1 1 1 1 ​ 设a[i][j]a[i][j]a[i][j]点的向上的可拓展的高度为 hhh,那么我们要查找的就是在此高度范围内包含a[i][j]a[i][j

半杯的博客 177

美团外卖mtgsig 1.2逆向工程:从补环境到签名生成全解析

本文深入解析了美团外卖mtgsig 1.2签名算法的逆向工程全流程。从环境检测原理与补环境实战入手,详细拆解了签名JSON中每个关键字段的生成逻辑,并重点剖析了核心签名a2的生成步骤,涉及设备指纹、MD5、AES加密等关键技术。最后提供了构建签名生成器的实践思路与常见坑点,为理解复杂风控体系提供了完整的技术视角。

weixin_29324401的博客 1752

洛谷:统计方形(数据加强版)C语言

题目背景 1997年普及组第一题 题目描述 有一个n×m方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。 输入格式 一行,两个正整数n,m(n≤5000,m≤5000)。 输出格式 一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。 输入输出样例 输入 #1复制 2 3 输出 #1复制 8 10 思路: P2241 统计方形_哔哩哔哩_bilibili洛谷 P2241 统计方形https://www.bilibili.com/video/B..

m0_59321697的博客 2904

【LPDDR4 - 学习二】LPDDR4 介绍 ——LPDDR4 芯片引脚说明解析

本文系统解析了LPDDR4内存芯片的引脚定义与特性,重点介绍了272球POPFBGA封装的双通道架构。内容涵盖电源管理(三级供电架构与上电时序)、控制信号(差分时钟与复用命令总线)、数据接口(16位双向数据总线与选通信号)以及校准复位等核心模块。通过表格详细列明了各引脚电压范围、功能定义及工程注意事项,并附有典型封装球位分布图。全文基于JEDEC标准,为移动设备内存设计提供全面的硬件参考,特别强调电源时序控制、信号完整性及抗干扰设计等关键点。

zap15622077817的博客 2636

手把手教你用C#和LibUsbDotNet实现USB设备通信(含完整代码示例)

本文详细介绍了如何使用C#和LibUsbDotNet库实现USB设备通信,包括设备识别、连接建立、同步/异步数据读写等核心操作。通过完整的代码示例,开发者可以快速掌握USB通信的关键技术,适用于工业自动化、医疗设备等多种场景。重点讲解了数据读写优化和错误处理技巧,帮助提升通信效率和可靠性。

a3b4c5的博客 703

统计矩形中的正方形和长方形

统计方形

weixin_62801320的博客 1111

25年PINN创新点大盘点!

在科研论文的激烈角逐中,想轻松产出高含金量成果?物理信息神经网络(PINN)堪称“宝藏研究方向”,是冲击高分区论文的绝佳赛道!对于渴望发表优质论文的科研伙伴,这三大研究路径值得重点关注。首先是自适应PINN,在PINN训练过程中,物理方程与实测数据间的矛盾常常导致权重调节困难,而恰好直击这一痛点,是极具价值的研究方向。其次,同样前景广阔,传统多物理场同时训练效果欠佳,如今分阶段训练方法脱颖而出,成效显著且竞争较小。最后,探索及多任务学习等技术的融合,能实现优势叠加,碰撞出创新火花。

Malaai的博客 1970

【LeetCode】统计全 1 子矩形(单调栈)

LeetCode 1504:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的子矩形数量。使用单调栈求解。

小七的博客 574

QT C++ AI棉花智能变量灌溉工上位机(信创完整版)

北斗履带灌溉机器人/田间分区电磁阀基站 → 多层土壤温湿度/盐分EC传感器实时采集墒情 → 双目AI视觉扫描棉田长势、病苗分布 → AI融合**生育期+土壤墒情+盐分+棉株长势**计算变量灌溉定额、水肥配比、灌溉时长 → 分区电磁阀/变频水泵变量供水,病弱苗地块减量、干旱地块增量;墒情、盐分、长势多因子闭环修正灌水量;多层土壤含水率(0–10/20–40/40–80cm)、土壤EC盐分、土壤温度、空气温湿度、蒸发量、北斗地块坐标、管道水压、水肥罐液位、分区流量计、水泵电机负载、滴灌带压力反馈。

寒寒豆豆软件公司的博客 183

【Camera2教程一】Camera2的框架Pipeline和framework中核心类和接口的详细介绍

Camera2 的 API 模型被设计成一个 Pipeline(管道),它按顺序处理每一帧的请求并返回请求结果给客户端。

jiangchaobing_2017的博客 790

leetcode.1504. 统计全 1 子矩形(单调栈-java)

输入:mat = [[0,1,1,0],[0,1,1,1],[1,1,1,0]]// 在6位置的左边,离6位置最近、且小于高度6的位置是2,2位置的高度是3。// 在6位置的右边,离6位置最近、且小于高度6的位置是9,9位置的高度是4。输入:mat = [[1,0,1],[1,1,0],[1,1,0]]// 1) 求在3~8范围上,必须以高度6作为高的矩形,有几个?// 那么,1) 求必须以位置6的高度6作为高的矩形,有几个?// 如上图,假设在6位置,1的高度为6。有 8 个 1x1 的子矩形。

SP_1024的博客 434

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

算法39:统计全 1 子矩形(力扣1504)----单调栈

单调栈、数组压缩

街头小瘪三的专栏 1211

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SSL P1337 矩形统计___单调栈

题目大意: N ≤ 1000 分析: 对于每一行而言, 我们以这一行为底边,固定底边然后向上伸, ai表示iii列能向上伸多少(直到出界或者碰到障碍) 然后我们考虑这一行的贡献, 为了避免重复,我们对于这些ai,只统计他们能拥有的矩形中,有边长与底边相交的矩形 然后统计的时候就是可以维护单调栈做,具体看代码 代码: #include <iostream> #include <c...

生如夏花之绚烂 418

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

nssl1337-矩形统计【单调栈】

正题 题目大意 一个n∗nn*nn∗n的矩阵,然后有些位置破损。求可以剪出多少个不破损的矩形。 解题思路 预处理upi,jup_{i,j}upi,j​表示从(i,j)(i,j)(i,j)向上多少格子都是非破损格子。 然后我们枚举下界LowLowLow,将图像变成一个下部平整的条形图,第iii个位置高度为uplow,iup_{low,i}uplow,i​。为了方便阐述我们统一用hih_ihi​代...

QuantAsk 460

SSLOJ 1337.矩形统计【单调栈】

233题目:题意:分析:代码: 题目: 传送门 题意: 给出一张可能存在部分破损的纸张,求用该纸张可以剪出多少不同矩形 分析: 有个很显而易见的思路,用总方案减去不合法的方案 前者在枚举时便可轻松计算出来 后者通过记录该行当前最近的破损位置和该列当前最近一个不与其他不合法方案重合的破损位置 找该列的时候,我们可以用单调栈实现 代码: #include<cstdio> #incl...

qq_35786326的博客 282

单调栈的“版图统计”:从“最大”到“所有”——统计全1子矩形

今天这道题,再次展示了“降维打击 + 单调栈”这一组合的惊人威力。LC 85 (最大矩形):我们用单调栈,在 O(n) 内找到了直方图的最大面积。LC 1504 (统计矩形):我们用单调栈配合DP,在 O(n) 内找到了直方图的所有矩形个数。这个的转移方程,是解决此类“直方图计数”问题的核心所在。它精妙地将问题分解为“由我j新贡献的”和“从继承来的”两部分。咱们下期见。

2301_80334067的博客 1049

【数据结构 单调栈】SSL_1337 矩形统计

题意 给出一个矩形,其中000代表完好,111代表破损,求出从中能截出的矩形个数。 思路 容斥思想,用总的−-−破损的方案自然得出答案。 对于一个点,我们发现只有它左边和上面的破点对它有贡献,且破点的坐标是单调递减的,即当我们的xxx坐标越大,yyy坐标就要越小,这里使用单调栈维护距离每一列最近的破点。 代码 #include<stack> #include<cstdio>...

GOODPLACE 289

单调栈练习(四)— 统计全 1 子矩形

单调栈练习(四)— 统计全1子矩阵

weixin_43936962的博客 495

单调栈结构练习——统计全1子矩形

题目 给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的子矩形数量。 package com.harrison.class14; /** * @author Harrison * @create 2022-03-27-13:39 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */ // 测试链接:https://leetcode.com/problems/count-submatrices-with-all-ones public class Code05

Harrison的学习博客 771

leetcode *1504. 统计全 1 子矩形(周赛196)(单调栈)(待研究)

【题目】*1504. 统计全 1 子矩形 给你一个只包含 0 和 1 的 rows * columns 矩阵 mat ,请你返回有多少个 子矩形 的元素全部都是 1 。 示例 1: 输入:mat = [[1,0,1], [1,1,0], [1,1,0]] 输出:13 解释: 有 6 个 1x1 的矩形。 有 2 个 1x2 的矩形。 有 3 个 2x1 的矩形。 有 1 个 2x2 的矩形。 有 1 个 3x1 的矩形。 矩形数目总共 = 6 + 2 + 3

Sophia_fez的博客 508

leetcode 1504. Count Submatrices With All Ones | 1504. 统计全 1 子矩形(单调栈)

题目 https://leetcode.com/problems/count-submatrices-with-all-ones/ 题解 本题与 leetcode 84. Largest Rectangle in Histogram | 84. 柱状图中最大的矩形(单调栈) 思路相似,借鉴了原来的代码。 以及类似问题:leetcode 85. Maximal Rectangle | 85. 最大矩形(单调栈) class Solution { public int numSubmat(int[][

寒泉 4万+

单调栈(每日温度,求柱状统计图最大矩形面积等问题)

3.进行比较,当前元素和栈口元素的大小,如果mid<=right,那么当前元素进栈,如果mid>right,则计算高度和。宽度(if(top==-1),wid=i,else,wid=i-s->data[--(s->top)]-1)2.全过程的进栈和出栈仅凭top的移动来完成即可,因为我写的是数组形式。1.将栈的准备工作做好:top=-1,时间发杂度为O(n^2).栈是用来存储元素下标的。时间复杂度为O(n).

2501_94335009的博客 297

单调栈

参考博客: https://blog.youkuaiyun.com/hebtu666/article/details/82717317 单调栈性质: 1、若是单调递增栈,则从栈顶到栈底的元素是严格递增的。若是单调递减栈,则从栈顶到栈底的元素是严格递减的。 2、越靠近栈顶的元素越后进栈。(显而易见) 用法一 给出一个柱形统计图(histogram), 它的每个项目的宽度是1, 高度和具体问题有关。 现在编程求出...

flymoyu的博客 194

Poj 2559 Largest Rectangle in a Histogram(柱形统计图中的最大矩形面积)

 给出一个柱形统计图中,求其中的最大矩形面积 做完这道题,搜了一下题解大部分基本都是单调栈......然而做之前并不知道这是什么,其实用递推也可以做这道题,理解起来比较容易。 用两个数组l,r记录当前坐标可以向左和向右延伸的最远位置的坐标,然后就是递推了。 初始时将l[i],r[i]的值置为i,即自己的坐标。这里拿l[i]举例: 从左向右扫描统计图,计算当前位置的l[i]时,如果

GODSPEED 1031
上一篇: 膜拜神牛【LIS】
下一篇: 【洛谷P4549】【模板】裴蜀定理【裴蜀定理】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值