首页 > 编程语言 >[算法篇] 简单讲讲一维前缀和与差分

[算法篇] 简单讲讲一维前缀和与差分

时间:2024-06-23 17:53:21浏览次数:23  
标签:arr 数组 int cout cin 差分 一维 前缀

前缀和:
先给定义:指某序列的前n项和
是不是与我们高中所学的数列求和类似?

给出用途:

如我们于一组长度为n的整数序列中询问m次,每次询问中输出区间[l,r]中数之和

倘若我们先不使用前缀和,预测一下思路将会是:m次询问中,每一次都求和数组[l,r]
时间复杂度为O(n),思路很简单但若m非常大则将循环很多次,可想而知这并非较优的办法。

回归数列知识,设数列a[n]的前n项和我们设为S[n]
我们要求a[4]到a[10]之和,则可得a[4]+a[10]=S[10]-S[3]即可
所以前缀和便是令S[r]-S[l-1]

接下来便简单了,贴出代码:(于数组a中求区间[l,r]中之和)

#include<iostream>
using namespace std;
int a[10000],arr[10000];//在main函数的数组默认每一项都为0

int main() {
    ios::sync_with_stdio, cout.tie(0), cin.tie(0);//这一行是关闭输入输出流的同步,提高程序运行效率,读者可自行去了解
    int m,n;//m为询问次数,n为所需序列长度
    cin >> m >> n;
    for (int i = 1; i <= n; ++i) {//i从1开始
        cin >> a[i];
        arr[i] = arr[i - 1] + a[i];
    }
    while (m--) {
        int l, r;
        cin >> l >> r;
        cout << arr[r] - arr[l - 1] << '\n';
    }
    return 0;
}

特别注意:我们这里输入时以i=1为首项,是为了后面i-1时不为-1


前缀和具有良好的查询性质,而差分具有良好的修改性质


差分其实便是前缀和的逆运算,可以快速对数组某一区间进行修改操作

我们需要引入一个辅助数组b[n],令b[i]=a[i]-a[i-1](当i=1时,b[1]=a[1]-a[0],a[0]=0)

以下呈现目的:
我们不妨将b[n]中求和b[1]到b[j]
即b[1]+b[2]+b[3].....+b[j]=(a[1]-a[0]) + (a[2]-a[1]) + (a[3]-a[2]) +....+ (a[j]-a[j-1])
所以则等于a[j],这像不像我们高中时常用的裂项求和?

利用这个如何体现出修改的用途呢?

首先:
a[1]=b[1]
a[2]=b[1]+b[2]
a[3]=b[1]+b[2]+b[3]
a[4]=b[1]+b[2]+b[3]+b[4]
a[n]=b[1]+b[2]+b[3]+b[4]+...+b[n]

假设我们想让[3,n]中的数同时+3
则我们只需令b[3]+3,则a[3]往后数的都会同时+3
如:
a[3]+3=b[1]+b[2]+b[3]+3
a[4]+3=b[1]+b[2]+ (b[3]+3) +b[4]
...
那如果只令一小段,如[3,5]中同时+3呢
我们只需令b[3]+3,再让b[6]-3
我们于草稿纸中画出
不难发现a[3]往后同时+3,再让a[6]往后同时-3,则只有a[3]到a[5]进行了+3的修改

这种方法是否比通过循环令原数组挨个修改快速许多?

解决问题:给定一个长度为

标签:arr,数组,int,cout,cin,差分,一维,前缀
From: https://www.cnblogs.com/Mashiro-zBlog/p/18263720

相关文章

  • 多因素方差分析
    在多因素方差分析中,我们会遇到数据的组织,这个对后续SPSS进行分析特别重要,其中列联表的数据组织难倒了很多大学生,为此在这里,进行了总结:1.符号说明2.数据组织设置分组变量(以SPSS的分析为例)3.提出原假设H0:不同地区对商品的销售量均值无显著性影响,即dqi=0H0:不同日期对商品的......
  • 一维静态数组
    数组,拆分就是数的组合,里面可能会出现重复的数字;同时数组分为一维数组和二维数组。我们可以把一维数组理解为一条线,把二维数组理解成一个面。当然,三维数组,甚至四维数组,只要你有能力,都可以在c++,同样有数组。这次我们讲一维静态数组语法定义Typarr[n];//定义一个类型为Ty......
  • pytorch实现:PINN 寻求一维非线性薛定谔方程数值解
    pytorch实现:PINN寻求一维非线性薛定谔方程数值解pytorch实现:PINN寻求一维非线性薛定谔方程数值解1.非线性薛定谔方程2.PINN实例2.1偏微分方程条件2.2损失函数推导2.3损失函数定义3.代码实现4.训练结果5.源代码pytorch实现:PINN寻求一维非线性薛定谔方程数值......
  • Python统计实战:一题搞定双因子方差分析(交互效应分析)
    为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。(以下练习题来源于《统计学—基于Python》。联系获取完整数据和Python源代码文件。)练习题城市道路交通管理部门为研究不同路段和不同时段......
  • 前缀和
    前缀和前缀和是什么可以说,前缀和是一种优化程序运行时间的一种方法,一般用于求一个序列中的区间和。前缀和的原理顾名思义,前缀和数组,即一个序列中前\(i\)个数据之和。\[b_i=\sum_{j=0}^{i}a_j\]所以\(a_l\)到\(a_r\)的和是:\[\sum_{j=l}^{r}a_j=b_r-b_{l-......
  • 【二维差分】2132. 用邮票贴满网格图
    本文涉及知识点二维差分LeetCode2132.用邮票贴满网格图给你一个mxn的二进制矩阵grid,每个格子要么为0(空)要么为1(被占据)。给你邮票的尺寸为stampHeightxstampWidth。我们想将邮票贴进二进制矩阵中,且满足以下限制和要求:覆盖所有空格子。不覆盖任何......
  • 【Stata双重差分模型】双重差分DID的具体操作步骤
    目录一、简介二、数据准备数据收集:数据清洗:变量定义:三、模型构建四、实证分析描述性统计:平行趋势检验:双重差分估计:安慰剂检验:异质性分析:五、结果解读与讨论六、结论与展望七、DIDI扩展内容八、附录一、简介双重差分法(DID)是一种经济学中常用的计量方法,用于......
  • Python统计实战:一题巩固单因子方差分析
    为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。(以下练习题来源于《统计学—基于Python》。联系获取完整数据和Python源代码文件。)练习题一家管理咨询公司为不同的客户提供人力资源管理......
  • NumPy 差分、最小公倍数、最大公约数、三角函数详解
    NumPy差分离散差分意味着相邻元素之间的减法。例如,对于[1,2,3,4],离散差分将是[2-1,3-2,4-3]=[1,1,1]要找到离散差分,使用diff()函数。示例:importnumpyasnparr=np.array([10,15,25,5])newarr=np.diff(arr)print(newarr)返回:[510-20],因为15-......
  • 医学统计学~No.2 独立样本t检验&单因素方差分析
    最近一段时间在着手处理行为学数据,主要参考师姐的毕业论文,然鹅统计分析里写的统计方法并菜菜狗并不是很理解,困扰之下,感觉近两周工作没有一丝丝进展。今天浅找了几篇博士毕业论文,发现人家的统计分析里主要用了独立样本t检验和单因素方差分析,菜菜狗布灵布灵的大眼睛更忽闪忽闪啦,......