【算法训练(day5)】前缀和与差分

news2024/11/25 20:46:16

目录

一.一维前缀

二.二维前缀和

三.一维差分

四.二维差分


一.一维前缀

        1.前缀的作用

        前缀用于在求一部分区间的和,比方说有一组数据a1,a2,a3,a4,我们想知道从第一个元素一直相加到最后一个元素的和或者是从第二个元素加到第三个元素,这种情况下就能使用前缀和了。 

        2.前缀和的思路

        通常我们要求前缀和的时候题目会给出原始数组,我们需要另一个数组来记录每一个位置的前缀和,我们的前缀和数组记录从开头到当前位置的所有数据的和,用于后续的处理。这里用1,2,3,4,5,6,举例子,前缀和数组和原数组的对应关系如图,前缀和中一开始的0是为了处理求0个元素的前缀和。当我们要求部分区间的和的时候。我们直接用区间末的前缀和数据减去区间起始位置的前缀和就能求出这段范围的前缀和。因为我们前缀和数组内部存放的是从头到当前位置(原数组内)的数据和当我们做差的时候会将范围外的部分剪掉,这样留下的就是从范围起始位置到结束位置的前缀和了。这样求和的时间复杂度降为o(1)2c4da017ef144754855f3371287fba13.png

         3.代码实现


//一维前缀和
const int N = 100010;
int s[N];
int main()
{
	int n, m, l, r;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		cin >> s[i + 1];   //把第一个位置空出来这样就不用再单独处理第0个元素的问题,同时和和让数组下标和题目要求相符
		s[i + 1] = s[i] + s[i + 1];  //在输入的过程直接将前缀和计算出来(其实就是dp数组)
	}
	while (m--)
	{
		cin >> l >> r;
		cout << s[r] - s[l - 1] << endl;  // 从头加到位置r的前缀和减去从头加到l左边第一个位置的前缀和就是从l加到r的和,因为我们要去掉范围外的值,所以要减去l上一个位置的前缀和
	}

	return 0;
}

二.二维前缀和

 1.二维前缀和的作用:

在一维前缀和的基础上增加一维,原先的前缀和是从左向右计算,二维前缀和是从左上角向右上角计算的矩阵,这时候求的区间和是一个矩阵范围的区间和。

2.二维前缀和一维前缀和的大体思路是一样的。也需要构建前缀和数组来保存不同阶段的数据和。构建的前缀矩阵多表示一行一列,来对应求第0行或者第0列的情况。这个前缀矩阵保存的值就是从左上角第一个点到不同位置范围的和的值。所以我们需要首先计算出从最左上角到当前位置的前缀和,并用这个值形成前缀数组。

                                                原数组和前缀和数组对应关系如图。0f4f0bb8ed7b4c68af9f8cbda42a6ccf.png

 由一维前缀和我们可以知道范围末的前缀和减去范围和就是所求范围的值。二维也是同样的道理。我们取随机位置为例,在计算当前前缀和的时候,首先我们需要加上当前位置在原数组的值然后再将上之前已经计算过的前缀和,由图中的对应关系我们可以明显看出,之前计算过的前缀和应该是在前缀和数组当前位置的左边和上边。同时我们也能发现,加上左边和上边的前缀和后,在原数组中当前位置左上角的矩阵会被重复计算两次。所以我们要减下去。这个重复计算的矩阵本身也是个前缀和,对应的就是前缀和数组中当前位置左上角的值。所以前缀和形成的过程如图88829dc329364972b1ac67c6edefc691.png

 3.代码实现

二位前缀和
const int N = 1010;
int s[N][N];
int main()
{
	int n, m, x1, y1, x2, y2, q;
	cin >> n >> m >> q;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			cin >> s[i][j];
			s[i][j] = s[i - 1][j] + s[i][j - 1] + s[i][j] - s[i - 1][j - 1];  //插入的时候直接用新加入的值加上左边和上边的前缀和最后去掉重复计算的部分也就是左上角的前缀和
		}
	}

	while (q--)
	{
		cin >> x1 >> y1 >> x2 >> y2;
		cout << s[x2][y2] + s[x1 - 1][y1 - 1] - s[x2][y1 - 1] - s[x1 - 1][y2] << endl;//最后用要求的右下角的前缀和(这里的前缀和是大于我们要求的范围的)减去每个范围外的右下角的前缀和
																					//就是减去x2行的左边范围外的第一个值和y2列上边范围的第一个值,最后减去重复的部分,也就是两端范围减重复的部分
	}
	return 0;
}

        

三.一维差分

        1.一维差分的作用:

        当我们拿到一个数组并想对数组一定范围内的每个数据进行加减时候可以用到差分的思想。差分的本质就是前缀和的逆向操作,通过前缀和的数组反向求出原来的数组就是差分。我们通过求出原来的数组并对原来数组的某个数据进行加减,操作后再求前缀和数组就能拿在一定范围对每个数据进行加减后的前缀和数组。(因为前缀和数组是由原数组依次叠加出来的,所以原数组修改一个值对应的就是前缀和数组里当前位置以后的所有值全部受影响)这样就能让原来对前缀和数组o(n)的操作变成对原数组o(1)的操作

        2.一维差分的思路:

        我们把拿到的数组当成前缀和数组,这样对当前这个数组的范围内相加减就能转换成对差分数组的操作。于是我们要先构建出差分数组。因为我们知道差分数组是前缀和的逆向操作,所以我们在插入的时候可以通过计算两个相邻前缀和的差值计算出当前差分数组的值。再根据要修改的范围对差分数组进行修改。最后对修改后的差分数组求前缀和就能得到修改后的前缀和数组。50e51d1bcc804a46878a1c4264496b6c.png

 前缀和数组和差分数组的构造关系如图,加入我们想在前缀和数组从4到6每个数据都加上25c5945b362d0442eb3b8931376768f9a.png

 我们在差分数组内对数据进行修改最后在合成新的前缀和数组,就能得到我们想要的操作。2db373b089eb4471bfd86a96cfb9e2e7.png

四.二维差分

1.二维差分的作用:

可以类比二维前缀和的做法。二维差分就是二维前缀和的逆向运算,通过构造出二维差分数组,将对前缀和的范围区间操作转换成对差分数组的一维操作。

2.二维差分的思路:

我们拿到给定的矩阵后将其作为二维前缀和数组。我们先要反向操作求出二维差分数组。通过二维前缀和我们已经知道前缀和数组和差分数组的对应关系了,这里就不在画了。15f726e3d5f0410baa761cd7872af164.png

这样我们就拿到了差分数组接下来再根据要求对差分数组进行更改,比如说我们让中间一行除了最后一个值全部加上1.ba269ffc74bb4b04a4c065489c8f7840.png 

 最后再求一遍二维前缀和就能拿到想要的值。

3.代码实现

const int N = 1010;
int dif[N][N];
int ori[N][N];
int main()
{
	int n, m, q;
	cin >> n >> m >> q;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			cin >> ori[i][j];       
			dif[i][j] += ori[i][j];	 //插入差分数组
			dif[i][j + 1] -= ori[i][j];
			dif[i + 1][j] -= ori[i][j];
			dif[i + 1][j + 1] += ori[i][j];
		}
	}

	//进行操作
	while (q--)
	{
		int x1, x2, y1, y2, c;
		cin >> x1 >> y1 >> x2 >> y2 >> c;
		dif[x1][y1] += c;	 //修改差分数组
		dif[x1][y2 + 1] -= c;
		dif[x2 + 1][y1] -= c;
		dif[x2 + 1][y2 + 1] += c;
	}
	//求回前缀和
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			dif[i][j] = dif[i][j] + dif[i-1][j]+dif[i][j-1]-dif[i-1][j-1];
		}
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			cout << dif[i][j]<<" ";
		}
		puts("");
	}
	return 0;
}
 

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

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

相关文章

docker部署elasticsearch:8.6.2, kibana,logstash 版本以及kibana的使用

文章目录 1、参考2、安装elasticsearch:8.6.22.1 创建网络2.2 创建无密码访问的elasticsearch服务2.3 访问验证2.4 建一个索引试试&#xff0c;此索引名为my-book&#xff0c;有六个字段2.5 用GET命令获取索引信息试试&#xff0c;如下&#xff0c;符合预期2.6 再试试批量导入一…

redis集群的架构、问题,附脑洞

本文首发自「慕课网」&#xff08;www.imooc.com&#xff09;&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"或慕课网公众号&#xff01; 作者&#xff1a;一凡 | 慕课网讲师 Redis 是一种开源&#xff08;BSD 许可&…

魔术表演-第14届蓝桥杯省赛Scratch中级组真题第1题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第136讲。 魔术表演&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组真题第1题&#xf…

【arxiv】论文找 idea : 关于 OVD 的论文扫读(四)

文章目录 一、DetCLIPv2: Scalable Open-Vocabulary Object Detection Pre-training via Word-Region Alignment二、Prompt-Guided Transformers for End-to-End Open-Vocabulary Object Detection三、Bridging the Gap between Object and Image-level Representations for Op…

2023年京东618预售数据免费开放(往年618热门品类数据回顾)

2023年618京东平台整体的活动节奏分为五个时期&#xff1a; 第一时期为预售期&#xff1a;2023年5月23日晚8点-5月31日 第二时期为开门红&#xff1a;5月31日20点-6月3日 第三时期为场景期&#xff1a;6月4日-6月15日 第四时期为高潮期&#xff1a;6月15日20点-6月18日 第五…

前端HTML之基础扫盲

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 本篇文章将讲解HTML的基础&#xff0c;认识HTML的基本结构&#xff0c;学会使用常用的HTML标签&#xff0c;愿诸位喜欢 目录 文章目录 一、创建第一个HTML程序 二、HTML基本标签介绍 2.1 HT…

AAAI2024 The Thirty-Eighth Conference on Artificial Intelligence

Past Conferences For information about past AAAI Conferences, please consult the following pages. https://aaai.org/conference/aaai/ Future Conferences https://aaai.org/aaai-conference/ 2024 年 2 月在加拿大温哥华举行的第 38 届 AAAI 人工智能年度会议 The…

Linkage Mapper 中 Climate Linkage Mapper功能解析(含实例分析)

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 Climate Linkage Mapper的输出结果,应用于华盛顿州和英属哥伦比亚省之间跨境地区的白松树效果图 图片来源地址 文

解决weekofyear跨年问题

目录 前言跨年问题计算当年第几周前言 前段时间,做了一个日期维度表的需求,发现 计算当年第几周 有误,发现 Hive 中 weekofyear 函数存在跨年问题! 跨年问题 这一周算上一年还是下一年,取决于这一周的大多数日期(4天及以上)在哪一年。算在前一年,就是前一年的最后一…

K8s in Action 阅读笔记——【1】Introducing Kubernetes

K8s in Action 阅读笔记——【1】Introducing Kubernetes 多年前&#xff0c;大多数软件应用程序都是庞大的单体应用&#xff0c;运行在单个进程或少量进程分布在几台服务器上。这些传统系统今天仍然广泛存在。它们具有缓慢的发布周期&#xff0c;更新相对不频繁。在每个发布周…

【软考数据库案例分析】(全)

目录 1.1 案例分析概述 1.2 数据流图设计 1.3 概念结构设计 1.4 关系模式设计 1.5 SQL语言设计 1.5.1 创建表(create table) 1.5.2 修改表 (alter table) 1.5.3 删除表 (drop table) 1.5.4 索引 1.5.5 视图 1.5.6 查询语句格式 1.6.7 分组查询 1.5.8 其他操作 1.5…

图书系统小练习

1.对于任何系统&#xff0c;我们最先想到的就是普通用户和管理员&#xff0c;所以我们第一件事情就是创建一个包&#xff0c;里面包含 管理员 Admin&#xff08;继承User&#xff09; 普通用户 NormalUser(继承User) abstract类的 User 2.然后就是我们的菜单了 我们将管…

“云端”医学馆 | 平行云助力拜科打造医疗虚仿新模式

“云端”医学馆——拜科医疗虚仿新体验 当前&#xff0c;各个行业都正经历着一场深刻的数字化变革&#xff0c;医疗领域也没有例外&#xff0c;很多医疗厂商都在积极拥抱数字化技术的融入与应用。拜科数字生物科技&#xff08;中国&#xff09;有限公司正是医疗虚仿潮流中的领…

数字图像处理 使用C#进行图像处理八 Unsharp Masking

一、Unsharp Masking简述 Unsharp Masking是一种线性图像处理技术,用于锐化图像。清晰的细节被识别为两者之间的差异原始图像及其模糊版本。然后缩放这些细节, 并添加回原始图像: 增强图像 = 原始图像 + 数量 *(原始图像 - 模糊) 模糊步骤可以使用任何图像滤波方法,例如…

AI绘画设计师专用单词表;游戏业AI正在疯抢工作;使用AI工具翻译整本英文书;用GPT-4搞定调研报告 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『如果是皮克斯制作了哈利波特系列』又萌又暖还可爱&#xff0c;想 rua&#xff01;&#xff01; 皮克斯是美国顶级的电脑动画制作公司…

IMX6ULL裸机篇之DDR3实验总结

一. DDR实验 之前关于 IMX6ULL开发板&#xff0c;有关DDR实验。做了DDR内存芯片的初始化&#xff0c;校验与超频测试。 博文链接如下&#xff1a; IMX6ULL裸机篇之DDR3初始化_凌雪舞的博客-CSDN博客 IMX6ULL裸机篇之DDR3校验与超频测试_凌雪舞的博客-CSDN博客 经过了初始化…

修改linux中的grub和grub2.cfg文件重启服务器失败报错

文章目录 前言一、确认下root路径二、在引导界面进入grub 前言 修改了grub在服务器重启过程中发现系统起不来&#xff0c;且进入了紧急模式&#xff0c;相关报错如下&#xff1a; /dev/centos/root does not exist 总体原因就是找不到启动系统的文件位置导致的&#xff0c;解…

实时频谱-2.1实时频谱分析仪的工作方式

现代实时频谱分析仪 现代实时频谱分析仪可以采集分析仪输入频率范围内任何地方的传输频带或频宽。这一功能的核心是RF 下变频器&#xff0c;后面跟有一个宽带中间频率(IF)段。ADC数字化IF信号&#xff0c;系统以数字方式执行所有进一步的步骤。DSP算法执行所有信号调节和分析功…

如何提炼出优质的Prompt

基于大模型实现优质Prompt开发 1. 引言1.1 大规模预训练模型 2. Prompt开发2.1 Prompt基本定义&#xff1a;2.2 为什么优质Prompt才能生成优质的内容2.3 如何定义优质的Prompt 3. Prompt优化技巧3.1 迭代法3.1.1 创作评估3.1.2 基础创作3.1.3 多轮次交互 3.2 Trick法3.2.1 戴高…

如何使用SolVES 模型与多技术融合实现生态系统服务功能社会价值评估?

生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xff0c;对提升人类福祉具有重大意义&#xff0c;且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目&#xff08;Millennium Ecosystem Asse…