D - 统计子矩阵 (双指针+前缀和+降维处理)

D - 统计子矩阵 (双指针+前缀和+降维处理)

1、问题

D - 统计子矩阵

2、分析 + 代码

(1)纯暴力做法:

这个做法就很简单了,我们直接枚举所有的子矩阵,然后在对每一个子矩阵内部的元素逐一累加起来计算比较即可。这里就不写代码了,直接从第二种方法开始。

(2)暴力+二维前缀和:

这里和方法一是一致的,依旧是去枚举所有的子区间,在计算子区间的和的时候,我们使用二维前缀和的算法进行优化,从而将计算矩阵和的算法的复杂度从 O ( n ) O(n) O(n)降低到 O ( 1 ) O(1) O(1)
此时我们能过百分之七八十的数据,但无法过所有的数据,因为此时的时间复杂度是 O ( n 4 ) O(n^4) O(n4)的,依旧很高。

#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
#define int long long
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 5e2 + 10;
int a[N][N], s[N][N];
int n, m, k;
int ans;

int cal(int x1, int y1, int x2, int y2)
{
	int res = s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1];
	return res;
}
void solve()
{
	cin >> n >> m >> k;
	for(int i = 1; i <= n; i ++ )
	{
		for(int j = 1; j <= m; j ++ )
		{
			cin >> a[i][j];
			s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
		}
	}

	for(int len_r = 1; len_r <= n; len_r ++)
	{
		for(int len_c = 1; len_c <= m; len_c ++)
		{
			for(int i = 1; i + len_r - 1 <= n; i ++ )
			{
				int x1 = i, x2 = i + len_r - 1;
				for(int j = 1; j + len_c - 1 <= m; j ++)
				{
					int y1 = j, y2 = j + len_c - 1;
					//cout << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
					if(cal(x1, y1, x2, y2) <= k)
						ans ++;

				}
			}
		}
	}
	cout << ans << endl;
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	solve();
}

当然,我们还可以进行一些优化,比如我们去标记一下那些大于 k k k的矩阵,这样的话,当后续的较大矩阵包含标记矩阵的时候,肯定也是不符合条件的,这样就可以不用去枚举了。如果数据不强的话,这个方法可以勉强过。这里就不做展示了。

(3)降维打击+双指针:

现在开始介绍这道题的正解:我们可以将二维转化成1维,转化方式如下:
在这里插入图片描述
对于每一个矩阵而言,我们将列都加在一起,这样就能看成一个一维的区间。

此时我们就可以准备两条线横线,两条横线之间的部分就是我们需要讨论的一维区间。如下图所示:
在这里插入图片描述
去枚举这两条线的时间复杂度是 O ( N 2 ) O(N^2) O(N2)的。

那么对于转换后的一维区间我们该如何讨论呢?此时我们使用的算法是:双指针。

我们下面直接针对转化后的一维数组进行讨论。
我们定义两个指针: l l l r r r,我们先固定 l l l指针,然后让 r r r指针向右移动,一遍移动一遍记录扫过的元素的和,当我们的和大于 k k k的时候,我们的 r r r指针停止扫描。此时,我们以 l l l为左端点的合法区间就是 ( r − l + 1 ) (r-l+1) rl+1。此时,我们就让 l l l向右移动,直到区间内的元素和小于等于 k k k为止。然后再让 r r r继续移动,重复上述操作。
在这里插入图片描述
该过程由于只扫描了一遍,所以时间复杂度是 O ( n ) O(n) O(n)的。
那么总的时间复杂度就是 O ( n 3 ) O(n^3) O(n3)的。

#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 500 + 10;
ll a[N][N];
ll s[N][N];
ll ans;
int n, m ,k;
void solve()
{
	cin >> n >> m >> k;
	for(int i = 1; i <= n; i ++ )
		for(int j = 1; j <= m; j ++ )
			cin >> a[i][j];

	for(int j = 1; j <= m; j ++ )
		for(int i = 1; i <= n; i ++)
			s[i][j]=s[i-1][j]+a[i][j];
	// for(int i = 1; i <= m; i ++ )
	// {
	// 	cout << s[i] << " ";
	// }
	// cout << endl;
	for(int l1 = 1; l1 <= n; l1 ++ )
	{
		for(int l2 = l1; l2 <= n; l2 ++ )
		{
			vector<int>col(m + 1);
			for(int i = 1; i <= m; i ++ )
				col[i] = s[l2][i] - s[l1 - 1][i];
			ll sum = 0, l = 1;
			for(int r = 1; r <= m; r ++ )
			{
				sum += col[r];
				if(sum <= k)
					ans += (r - l + 1);
				else
				{
					while(sum > k)
					{
						sum -= col[l];
						l ++;
					}
					ans += r - l + 1;
				}
			}	
		}
	}
	cout << ans << endl;

}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	solve();
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机二级】综合题目

计算机二级python真题 文章目录计算机二级python真题一、《大学慕课 两问 》二、综合应用题——价值链三、基本操作题 ——信息输出一、《大学慕课 两问 》 附件中的文件data.txt 是教育部爱课程网中国大学MOOC平台的某个 HTML页面源文件,里面包含了我国参与MOOC建设的一批大学…

STM32之点亮一个LED小灯(轮询法)

目录 一、初始化GPIO口 二、按键点亮LED灯&#xff08;轮询法&#xff09; 一、初始化GPIO口 1、点亮LED小灯前&#xff0c;需要先初始化GPIO口 HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) GPIO_TypeDef *GPIOx&#xff1a; //指初始化GPIO…

libvirt零知识学习5 —— libvirt源码编译安装(3)

接前一篇文章libvirt零知识学习4 —— libvirt源码编译安装&#xff08;2&#xff09; 在上篇文章及上上篇文章中构建libvirt的时候遇到了一个问题“ERROR: Problem encountered: YAJL 2 is required to build QEMU driver”。上篇文章讲到即使安装了相应的YAJL库仍然不能解决问…

HC小区管理系统window系统安装教程

实操视频 HC小区管理系统局域网window物理机部署教程_哔哩哔哩_bilibili 一、下载安装包 百度网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1XAjxtpeBjHIQUZs4M7TsRg 提取码&#xff1a;hchc 或者 123盘 hc-window.zip官方版下载丨最新版下载丨绿色版下…

12个 Python 装饰器让代码cleaner

0 — 引言装饰器能在在不影响质量的情况下用更少的代码做更多的事情。Python 装饰器是强大的工具&#xff0c;可帮助你生成干净、可重用和可维护的代码。我等了很久才想了解这些抽象&#xff0c;现在我已经有了扎实的理解&#xff0c;本篇是为了帮助你也掌握这些对象背后的概念…

uni-app+uView如何轮播图滑动时改变背景颜色和导航栏颜色

今儿的创作欲很高涨哈 &#x1f604; 这也是在群里看到的&#xff0c;群友问如何在滑动&#xff08;或者自动滑动&#xff09;的时候背景颜色能跟着变 正好之前做过这个需求&#xff0c;也分享一下 首先&#xff0c;页面的组成分为三部分&#xff1a; 自定义navbar 页面背景轮…

JavaSE进阶之(十六)枚举

十六、枚举16.1 背景16.2 枚举类型16.3 EnumSet 和 EnumMap01、EnumSet02、EnumMap16.1 背景 在 Java 语言中还没有引入枚举类型之前&#xff0c;表示枚举类型的常用模式是声明一组 int 类型的常量&#xff0c;常常用的就是&#xff1a; public static final int SPRING 1; …

ElementUI学习笔记

目录 一、简单介绍 二、安装 1、下载 2、引入 三、布局 1、简介 2、使用 3、好处 四、布局容器 1、常见排布 2、调整样式 五、按钮 1、简单引用 2、改变样式 3、加载中效果 六、表格 1、简单使用 2、样式修改 七、对话框 1、简单使用 2、添加自定义内容 3、…

7个最受瞩目的 Python 库,提升你的开发效率

当今时代&#xff0c;数据分析和处理已经成为了各行各业中不可或缺的一环。Python作为一种非常流行的编程语言&#xff0c;为我们提供了许多强大的工具和库来处理不同类型的数据。 在这篇文章中&#xff0c;我将向您介绍七个非常有用的Python库&#xff0c;这些库各自有着独特…

js调用gpt3.5

参考链接&#xff1a;直接在前端调用 GPT-3 API 效果图&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>ChatGPT Web Example</title><style>body {font-family: "Helvetica Neue"…

TimeQuest时序路径详解

&#x1f4a1; 基于TimeQuest软件来查看时序报告和分析时序路径 分析最坏传输路径 根据[FPGA典型时序路径的分析可知&#xff0c;最坏传输路径对应的建立时间&#xff08;setup time&#xff09;余量最小。所以&#xff0c;查看最坏传输路径也就是查看建立时间余量最小的路径。…

【Linux】安装DHCP服务器

1、先检测网络是否通 get dhcp.txt rpm -qa //查看软件包 rpm -qa |grep dhcp //确定是否安装 yum install dhcp //进行安装 安装完成后 查询 rpm -ql dhcp 进行配置 cd /etc/dhcp 查看是否有遗留dhcpd.conf.rpmsave 删除该文件 cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sampl…

ChatGPT能代替Oracle DBA吗?用Oracle OCP(1z0-083)的真题测试一下。

让我们来看看ChatGPT不能通过Oracle OCP的考试&#xff1f; 文章目录引言测试过程总结和分析关于博主&#xff0c;姚远&#xff1a;Oracle ACE&#xff08;Oracle和MySQL数据库方向&#xff09;。Oracle MAA 大师。华为云MVP。《MySQL 8.0运维与优化》的作者。拥有 Oracle 10g和…

mysql和mysql2模块的区别!!(nodejs中的模块)

mysql 和 mysql2 都是 Node.js 中常用的操作 MySQL 数据库的模块&#xff0c;它们的主要区别是在实现方式上略有不同。 mysql&#xff1a;是 Node.js 中比较早期的 MySQL 操作模块&#xff0c;该模块底层使用的是回调函数&#xff08;callback&#xff09;来实现异步操作。在处…

ESP32设备驱动-DHT12温湿度传感器驱动

DHT12温湿度传感器驱动 文章目录DHT12温湿度传感器驱动1、DHT12介绍2、硬件准备3、软件准备4、驱动实现1、DHT12介绍 DHt12是经典DHT11温湿度传感器的升级版&#xff0c;完全向下兼容&#xff0c;精度更高&#xff0c;增加了I2C接口。 DHT12 具有单总线和标准 I 2C 两种通讯&…

一文7个步骤从0到1教你搭建Selenium 自动化测试环境

【导语】Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。本文详细介绍了搭建自动化测试环境所需的工具&#xff0c;让你学习自动化测试不…

不用科学上网,免费的GPT-4 IDE工具Cursor保姆级使用教程

大家好&#xff0c;我是可乐。 过去的一周&#xff0c;真是疯狂的一周。 GPT-4 震撼发布&#xff0c;拥有了多模态能力&#xff0c;不仅能和GPT3一样进行文字对话&#xff0c;还能读懂图片&#xff1b; 然后斯坦福大学发布 Alpaca 7 B&#xff0c;性能匹敌 GPT-3.5&#xff…

[图像识别]关于cv2库无法安装的故障问题解决,全网最全解决方案!本人亲身测试,参考了stackoverflow、51CTO等博客文章总结而成

本文范畴&#xff1a;故障排查 cv2 技术 库安装 Linux/Unix 笔记本系统&#xff1a;win10 python版本&#xff1a;3.10 故障问题&#xff1a;无法安装cv2库 适应对象&#xff1a;程序员新手、运维程序员、大学生、青少年对系统感兴趣的爱好者等等 文章目录前言一、cv2库是什么&…

【C语言】栈区与堆区

目录分配管理方式申请大小限制不同申请效率不同总结&#xff1a;栈区、堆区 是内存模型 对比起来看 分配管理方式 栈区由编译器自动管理&#xff0c; 函数运行时分配&#xff0c;函数结束时释放。存放为运行函数而分配的局部变量&#xff08;函数结束时&#xff0c;其内临时…

超级实用,解密云原生监控技术,使用prometheus轻松搞定redis监控

前言 大家好&#xff0c;我是沐风晓月&#xff0c;本文收录于《 prometheus监控系列》 &#xff0c;截止目前prometheus专栏已经更新到第8篇文章。 本文中的是prometheus已经安装好&#xff0c;如果你还未安装&#xff0c;可以参考 prometheus安装及使用入门 若你想监控其他…