前缀和系列例题详解

这篇具有很好参考价值的文章主要介绍了前缀和系列例题详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

例1:前缀和

题目

输入一个长度为 n 的整数序列。

接下来再输入 m 个询问,每个询问输入一对 l,r。

对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。

输入格式

第一行包含两个整数 n 和 m。

第二行包含 n 个整数,表示整数数列。

接下来 m 行,每行包含两个整数 l 和 r,表示一个询问的区间范围。

输出格式

共 m 行,每行输出一个询问的结果。

数据范围

1≤l≤r≤n,
1≤n,m≤100000
−1000≤数列中元素的值≤1000

输入样例:

5 3
2 1 3 6 4
1 2
1 3
2 4

输出样例: 

3
6
10

题目解析

        本题如果使用暴力,会存在超时问题,因此,可以选择前缀和方法,在读取数据时,边读取边算出前 i 项的和(前 i 项的和=前 i-1 项的和 + 第 i 项),最后计算 l 和 r 区间的和时,通过前 r 项的和减去前 l-1 项的和,即可得出最终答案。

代码如下

#include<bits/stdc++.h>
using namespace std;
int a[100001], b[100001];

int main(){
	int n, m, i;
	cin>>n>>m;
	for(i=1;i<=n;i++){
		cin>>a[i];
		b[i]=b[i-1]+a[i];
	}
	int l, r;
	for(i=0;i<m;i++){
		cin>>l>>r;
		cout<<b[r]-b[l-1]<<endl;
	}
	return 0;
}

注:如果将数组定义在main函数外面,则初值为0,如果在main函数里面,则初值不确定。

例二:子矩阵的和

题目

输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每个询问包含四个整数 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。

对于每个询问输出子矩阵中所有数的和。

输入格式

第一行包含三个整数 n,m,q。

接下来 n 行,每行包含 m 个整数,表示整数矩阵。

接下来 q 行,每行包含四个整数 x1,y1,x2,y2,表示一组询问。

输出格式

共 q 行,每行输出一个询问的结果。

数据范围

1≤n,m≤1000,
1≤q≤200000,
1≤x1≤x2≤n,
1≤y1≤y2≤m,
−1000≤矩阵内元素的值≤1000

输入样例:

3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4

输出样例: 文章来源地址https://www.toymoban.com/news/detail-405222.html

17
27
21

题目解析

代码如下 

#include<bits/stdc++.h>
using namespace std;
int s[1001][1001];
int a[1001][1001];
int main(){
	int n, m, q;
	int x1, y1, x2, y2;
	scanf("%d %d %d", &n, &m, &q);
	int i, j;
	for(i=1;i<=n;i++){
		for(j=1;j<=m;j++){
			cin>>a[i][j];
			s[i][j]=s[i][j-1]+a[i][j];
		}
	}
	
	for(i=0;i<q;i++){
		cin>>x1>>y1>>x2>>y2;
		int sum=0;
		for(j=x1;j<=x2;j++){
			sum+=s[j][y2]-s[j][y1-1];
		}
		cout<<sum<<endl;
	}
	return 0;
}

到了这里,关于前缀和系列例题详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】输入一个十进制正整数,将它对应的二进制数的各位逆序,形成新的十进制数输出。题目分析及拓展应用。

    目录 一.题目及答案 二.对该题目的分析及详解 三.对该题的举一反三 1.将十进制数对应的n进制数各位逆序,形成新的十进制输出 2.将十进制数转换成相应的n进制数输出 如图, 题目及答案如下 :  该程序 完整代码如下 (需要可自由复制): 以下是对该程序的分析: 先来看

    2024年02月05日
    浏览(62)
  • 【算法精讲】一篇让你掌握前缀和算法(附图解和不少题目练习~~)

    前缀和算法是一种用空间换时间的算法,他常常用于解决某些题目或者作为某些高级算法的组成部分。 例如:让你求某个矩阵(一维)的子矩阵的最大值,如果使用暴力解法它的时间复杂度将会是O(n^2) ,但如果使用该算法就可以使其时间复杂度降低一个维度也就是O(N). 讲解

    2024年04月13日
    浏览(36)
  • 【A*算法——清晰解析 算法逻辑——算法可以应用到哪些题目】例题1.第K短路

    欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示:思路以及想法★✔ 如果大家觉得有帮助的话,感谢大家帮忙 点赞!收藏!转发! A*算法是什么

    2024年02月05日
    浏览(33)
  • 【算法系列篇】前缀和

    前缀和算法是一种常用的优化技术,用于加速某些涉及连续子数组或子序列求和的问题。它基于一个简单但强大的思想,通过提前计算并存储数组的前缀和,以便在后续查询中可以快速获取任意区间的和。 在许多算法问题中,我们需要频繁地查询子数组的和,例如最大子数组

    2024年02月11日
    浏览(40)
  • 一个概率论例题引发的思考

    浙江大学版《概率论与数理统计》一书,第13章第1节例2: 这个解释和模型比较简单易懂。 接下来,第13章第2节的例2也跟此模型相关: 在我自己的理解中,此题的解法跟上一个题目一样,其概率如下面的二维矩阵,第二级传输也就是n为2,矩阵一共有4中可能的概率,求其期

    2024年02月12日
    浏览(40)
  • Redis如何找出大量以某一个前缀开头的key

    Redis如何找出大量以某一个前缀开头的key 使用keys命令 KEYS命令是一个非常耗费资源的命令,它需要在Redis中遍历整个键空间,因此应该尽量避免在生产环境中使用。如果需要查找的key非常多,可以考虑使用SCAN命令,或者使用其他更高效的方式来实现类似的功能。 SCAN命令 SCA

    2024年02月20日
    浏览(43)
  • 【期末不挂科-单片机考前速过系列P4】(第四章:32题搞定基本指令例题)经典例题盘点(带图解析)

    前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《

    2024年02月02日
    浏览(54)
  • shell脚本之例题详解

    (1) 检查用户家目录中的test.sh 文件是否存在 ,并且检查 是否有执行权限 . (2) 提示用户输入100米赛跑的秒数,要求判断 秒数大于0且小于等于10秒的进入选拔赛 ,大于10秒的都淘汰,如果 输入其它字符则提示重新输入 ;进入选拔赛的成员再进一步判断男女性别,男生进男生组

    2024年02月02日
    浏览(52)
  • IP子网划分例题详解

    目录 1 子网划分概念: 2 划分方法: 子网划分方法:段,块,数的计算三步。 段就是确定ip地址段中既有网络地址,又有主机地址的那一段是四段中的那一段? 块就确定上一步中确定的那一段中的主机位数n,这样就确定该段中主机位中最大ip变化是2^n。 变化段数的计算:

    2023年04月17日
    浏览(46)
  • 【算法】—前缀和与差分详解

     前缀和指一个数组的某下标之前的所有数组元素的和( 即数列的前n项求和 ),前缀和是一种重要的 预处理 ,能够降低算法的时间复杂度,可以快速地求出某一段的和,对于处理区间之间的问题是往往十分高效 相比较其他算法而言, 前缀和更像是一种解题的技巧,一种优

    2024年02月04日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包