【AcWing】蓝桥杯集训每日一题Day17|单调队列|求直方图中最大矩形|单调栈|模型转化|1413.矩形牛棚(C++)

news2024/11/25 3:07:08
1413.矩形牛棚
1413. 矩形牛棚 - AcWing题库
难度:中等
时/空限制:1s / 256MB
总通过数:1914
总尝试数:3823
来源:

usaco training 6.1
算法标签

单调栈

题目内容

作为一个资本家,农夫约翰希望通过购买更多的奶牛来扩大他的牛奶业务。
因此,他需要找地方建立一个新的牛棚。
约翰购买了一大块土地,这个土地可以看作是一个 R 行(编号 1∼R)C 列(编号 1∼C)的方格矩阵。
不幸的是,他发现其中的部分方格区域已经被破坏了,因此他无法在整个 R×C 的土地上建立牛棚。
经调查,他发现共有 P 个方格内的土地遭到了破坏。
建立的牛棚必须是矩形的,并且内部不能包含被破坏的土地。
请你帮约翰计算,他能建造的最大的牛棚的面积是多少。

输入格式

第一行包含三个整数 R,C,P。
接下来 P 行,每行包含两个整数 r,c,表示第 r 行第 c 列的方格区域内土地是被破坏的。

输出格式

输出牛棚的最大可能面积。

数据范围

1≤R,C≤3000,
0≤P≤30000,
1≤r≤R,
1≤c≤C

输入样例:
3 4 2
1 3
2 1
输出样例:
6
题目解析

行数和列数都是在3000,整个矩阵的大小就是3000的平方,将近1000万的数据量
需要将时间复杂度控制在 O ( n m ) O(nm) O(nm),跟整个矩阵的方格数呈线性关系

枚举

枚举左右边界,再把上下边界枚举出来,再判断中间的格子是不是都没有被破坏
左右边界,n2,上下边界n2,中间的格子数量n^2,时间复杂度是 O ( n 6 ) O(n^6) O(n6)

优化

求中间格子里有没有坏方块,可以用二维前缀和,就不需要枚举了,直接算一下中间的总和是不是0就可以了
如果被破坏的话,就是1;没被破坏,就是0
用二维前缀和可以优化掉一个n^2

考虑能不能枚举少一些的边

可以先用 O ( n ) O(n) O(n)枚举下边界,下边界确定之后,可以预处理一下,每一列都可以求一下往上最多有多少块没有被连续破坏的方块
这样就可以得到一个直方图,求这个直方图中的最大矩形
可以用单调栈,做到 O ( n ) O(n) O(n)的计算量
总共就是 O ( n 2 ) O(n^2) O(n2)

单调栈

O ( n ) O(n) O(n)的时间预处理出来每个数左边第一个比它小的数,以及每个数右边第一个比它小的数

为什么可以用单调栈求解

在此基础上枚举一下上边界,矩形的上边界一定会取直方图的上面的一条边,可以依次枚举一下到底取哪一个小长条的上面的边
当枚举到其中一条边时,上下边界就确定了,接下来考虑左右边界,左边如果能延伸,就一直往左边延伸,知道延伸到左边第一个比当前的高度低的方块为止,有边界也是
![[Pasted image 20240409212850.png]]

上下边界确定之后,左边边界就等于左边第一个比它矮的长条右边这条边,右边边界就是右边第一个比当前矮的长条的左边这一条边
因此只要对于每一个长条,预处理出来左边第一个比它矮的长条,和右边第一个比它矮的长条,就可以知道左右边界了,进而就可以知道矩形的宽度了
就可以知道当前的最大面积是多少

高度预处理,每一列的高度都是独立的,所以可以按列预处理,通过递推的方法

代码
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 3010;

int n, m, P;
int g[N][N], h[N][N];  
//g表示每个位置有没有被破坏,h表示每个格子往上数最多可以数多少个没有被破坏的矩形
int stk[N], top;   //定义一个单调栈
int l[N], r[N];   //存一下左右第一个比它小的数

//确定下边界之后,如果求最大的面积
int work(int h[])
{
	//定义两个哨兵,最左边再画一个高度是-1,右边也是,这样对于每个格子,即使高度是0,左右也会存在一个比它小的,这样不需要特判边界
	h[0] = h[m + 1] = -1;
	top = 0;   //单调栈的栈先初始化为0
	//预处理左边
	stk[++ top] = 0;  //把左边界加进去
	for (int i = 1; i <= m; i ++)
	{
		//栈顶元素大于等于当前元素,就把栈顶元素弹出
		while (h[stk[top]] >= h[i]) top --;
		//左边第一个比当前元素小的元素就是栈顶元素
		l[i] = stk[top];
		//将当前元素加到栈当中
		stk[++ top] = i;
	}
	//同理预处理右边
	top = 0;
	stk[++ top] = m + 1;
	for (int i = m; i; i --)
	{
		while (h[stk[top]] >= h[i]) top --;
		r[i] = stk[top];
		stk[++ top] = i;
	}

	//定义一下答案
	int res = 0;
	//枚举一下最高点
	for (int i = 1; i <= m; i ++)
		res = max(res, h[i] * (r[i] - l[i] - 1));
	return res;
}

int main()
{
	//读入行数列数和被破坏矩形的数量
	scanf("%d%d%d", &n, &m, &P);
	//接下来读入每一个被破坏的位置
	while (P --)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		g[x][y] = 1;   //如果被破坏的话,标记成1
	}

	//预处理h数组
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			//如果当前的格子没有被破坏
			if (!g[i][j])
				h[i][j] = h[i - 1][j] + 1;

	//定义答案
	int res = 0;
	//枚举一下下边界
	for (int i = 1; i <= n; i ++)
		res = max(res, work(h[i]));

	printf("%d\n", res);

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1580612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【零基础学数据结构】链表

目录 1.链表的概念 ​编辑 2.链表的雏形 ​编辑 3.链表的组成 ​编辑 4.链表代码 4.1创建节点 4.2链表的打印 4.3链表的尾插 4.4链表的头插 4.5链表的尾删 4.6链表的头删 4.7链表的查找 4.8链表在指定位置之前插⼊数据 4.9链表在指定位置之后插⼊数据 4.9-1删除pos节点 4.9…

VBA技术资料MF140:在PowerPoint中移动幻灯片位置

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

Java基于微信小程序的校园外卖平台设计与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

openGauss学习笔记-255 openGauss性能调优-使用Plan Hint进行调优-Hint的错误、冲突及告警

文章目录 openGauss学习笔记-255 openGauss性能调优-使用Plan Hint进行调优-Hint的错误、冲突及告警 openGauss学习笔记-255 openGauss性能调优-使用Plan Hint进行调优-Hint的错误、冲突及告警 Plan Hint的结果会体现在计划的变化上&#xff0c;可以通过explain来查看变化。 …

公开课学习——JVM虚拟机面试核心点与性能优化点

文章目录 jdk的体系结构图Java语言的跨平台的特性&#xff0c;怎么实现的&#xff1f;jvm内部组成呢&#xff1f;pc的值怎么变得&#xff1f;main方法的栈帧有一点点区别&#xff0c;Math()是new出来的&#xff0c;放在堆区&#xff0c;这个堆区的math和我们栈帧中的局部变量表…

SpringBoot之集成Redis

SpringBoot之集成Redis 一、Redis集成简介二、集成步骤2.1 添加依赖2.2 添加配置2.3 项目中使用 三、工具类封装四、序列化 &#xff08;正常都需要自定义序列化&#xff09;五、分布式锁 一、Redis集成简介 Redis是我们Java开发中&#xff0c;使用频次非常高的一个nosql数据库…

【频繁模式挖掘】Apriori算法(附Python实现)

一、实验内容简介 该实验主要使用频繁模式和关联规则进行数据挖掘&#xff0c;使用Apriori算法和Python语言来编写和设计程序&#xff0c;然后用不同规模的数据集来检验效果&#xff0c;最后分析和探讨实验结果&#xff0c;看其是否达到了理想的效果。 二、算法说明 关联规则…

2024年生成式人工智能的现状:进展、挑战与未来展望的深入分析

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

wireshark抓包新手使用教程

Wireshark是非常流行的网络封包分析软件&#xff0c;可以截取各种网络数据包&#xff0c;并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括&#xff1a; 1、Wireshark软件下载和安装以及Wireshark主界面介绍。 2、WireShark简单抓包示例。通过该例子学…

【C++航海王:追寻罗杰的编程之路】探寻实用的调试技巧

目录 1 -> 什么是bug&#xff1f; 2 -> 调试是什么&#xff1f;有多重要&#xff1f; 2.1 -> 调试是什么&#xff1f; 2.2 -> 调试的基本步骤 2.3 -> Debug和Release的介绍 3 -> Windows环境调试介绍 3.1 -> 调试环境的准备 3.2 -> 学会快捷键…

不牺牲算法,不挑剔芯片,这个来自中科院的团队正在加速国产AI芯片破局

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 不降低大模型算法精度&#xff0c;还能把芯片的算力利用效率提升 2~10 倍&#xff0c;这就是…

java swing毕业设计题目管理系统eclipse开发Mysql数据库CS结构java编程

一、源码特点 java swing毕业设计题目管理系统 是一套完善的窗体设计系统&#xff0c;对理解SWING java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;&#xff0c;系统主要采用C/S模式开发。 应用技术&#xff1a;javamysql 开发工具&#xff…

杨笛一新作:社恐有救了,AI大模型一对一陪聊,帮i人变成e人

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站ai人工智能工具 更多资源欢迎关注 在社交活动中&#xff0c;大语言模型既可以是你的合作伙伴&#xff08;partner&#xff09;&#xff0…

SSL证书价格为什么差异如此大?

SSL证书市场品牌和种类众多&#xff0c;用户在选择证书的时候&#xff0c;也能随心所欲的购买到心仪的证书品牌类型。但是也有不少用户在选购的时候&#xff0c;也不禁有疑问&#xff1a;不同的证书品牌和类型为什么价格相差如此之大&#xff1f;确实&#xff0c;有的证书很便宜…

重磅来袭!2024CWE北京门窗幕墙展

CWE中国&#xff08;北京&#xff09;国际系统门窗及幕墙博览会 CWE China&#xff08;Beijing&#xff09;International System Doors Windows and Curtain Walls Expo 2024 年 8 月 29-31 日 北京&#xff0c;中国国际展览中心顺义馆 展会概况&#xff1a; 2024年CWE中国…

低代码开发平台推荐:国内超好用的十款实测评测

随着互联网技术的飞速发展&#xff0c;低代码平台逐渐成为企业数字化转型的利器。这类平台简化了开发过程&#xff0c;让非专业开发者也能参与到应用构建中来。本文将为您盘点国内十大低代码平台有&#xff1a;Zoho creator、&#xff0c;帮助您更好地选择适合自己企业的低代码…

【目标检测】-入门知识

1、回归与分类问题 回归问题是指给定输入变量(特征)和一个连续的输出变量(标签),建立一个函数来预测输出变量的值。换句话说,回归问题的目标是预测一个连续的输出值,例如预测房价、股票价格、销售额等。回归问题通常使用回归分析技术,例如线性回归、多项式回归、决策树…

Win10系统下的EDGE浏览器启用IE模式

Win10系统下的EDGE浏览器目前已弃用IE内核&#xff0c;这样在访问某些较老的网站会有兼容性问题&#xff0c;本文记录了在EDGE浏览器中启用IE模式的操作方法。 一、启用EDGE浏览器的IE模式 要打开Internet Explorer模式&#xff0c;执行以下步骤: 1、在Microsoft Edge的地址栏…

同城O2O:开发外卖跑腿小程序的技术探索

当下&#xff0c;开发一款功能完善、用户体验良好的外卖跑腿小程序成为了很多互联网企业的首要任务。今天小编将从技术角度对开发外卖跑腿小程序进行探索&#xff0c;为开发者提供一些技术上的思路和方法。 1.技术选型 在开发外卖跑腿小程序时&#xff0c;选择合适的技术栈至关…

Docker使用— Docker部署安装Nginx

Nginx简介 Nginx 是一款高性能的 web 服务器、反向代理服务器以及电子邮件&#xff08;IMAP/POP3/SMTP&#xff09;代理服务器&#xff0c;由俄罗斯开发者伊戈尔塞索耶夫&#xff08;Igor Sysoev&#xff09;编写&#xff0c;并在2004年10月4日发布了首个公开版本0.1.0。Nginx…