【算法基础】差分算法及其应用

简介: 【算法基础】差分算法及其应用

前缀和

要想知道差分算法,就要先知道前缀和算法, 应为差分是前缀和的逆运算。

定义

对于一个数组a,某一个数的前缀和表示这个数以及前面所有数的和

例如:

  • 对于数组a1,a2,……,an
  • 存在一个数组b1,b2,……,bn
  • 使得b1 = a1, bi = a1+…+ai = ai+bi-1

前缀和公式

S[i] = a[1] + a[2] + ... a[i]
a[l] + ... + a[r] = S[r] - S[l - 1]

前缀和的应用

对于前缀和算法,应用的场景是:在区间内进行查询或对子数组进行其他操作

1.利用前缀和计算区间的和

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

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

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

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

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

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

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

数据范围

1≤l<r ≤n,

1≤n, m ≤100000,

-1000≤数列中元素的值≤1000

#include<iostream>
using namespace std;
const int N = 1e5+10;
int w[N], s[N];   //w存储数组,s存储前缀和
int n, m, l, r; 
int main(){
  cin >> n >> m;
  for(int i = 1; i <= n; i++) cin >> w[i];
  for(int i = 1; i <= n; i++) s[i] = s[i-1]+w[i]; //更新前缀和
  for(int i = 0; i < m; i++){
    cin >> l >> r;
    cout << s[r]-s[l-1] << endl;    //区间和等于右边界前缀和-左边界前面的和
  } 
  return 0;
}

2.利用前缀和进行优化

【AcWing每日一题】4644. 求和


差分

定义

差分是在前缀和的基础上定义的,是前缀和的逆运算

  • 对于一个数组b1,b2,……,bn
  • 设其前缀和组成的数组为a1,a2,……,an
  • 即①a1 = b1; ②a2 = b1+b2; ③a3 = b1+b2+b3……
  • 则称数组a的差分是数组b

差分的应用

差分的应用场景:对于一个数组在区间[l,r]上对每个数进行操作

1.对区间的每个数进行操作

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

接下来输入m个操作,每个操作包含三个整数l,r,c,表示将序列中[,r]之间的每个数加上c。

请你输出进行完所有操作后的序列。
输入格式

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

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

接下来m行,每行包含三个整数l, r, c,表示一个操作。
输出格式

共一行,包含n个整数,表示最终序列。

数据范围

1≤n, m ≤100000, 1<l<r ≤n,

-1000<c≤1000,

-1000≤整数序列中元素的值≤1000
思路:

  • 由于a是b的前缀和,所以b在第i个位置的数加(减)c就等价于他的前缀和从i位置的数之后都加(减)一个c
  • 当限定在一个[l,r]区间内,需要两次操作:
    首先,在b的第l个位置加c,使得原数组第l个位置后面都加c。但是r后面多加了c!
  • 然后,在b的第r+1个位置减c,使得原数组只有[l,r]区间内加了c。
  • 由于这个题最终要落实到原数组,所以,利用原数组是差分数组的前缀和,将差分数组的前缀和填入原数组即可。
#include<iostream>
using namespace std;
const int N = 1e5+10;
int w[N], s[N];   //w存储原数组,s存储差分数组
int n, m, l, r, c; 
int main(){
  cin >> n >> m;
  for(int i = 1; i <= n; i++) cin >> w[i];
  for(int i = 1; i <= n; i++) s[i] = w[i]-w[i-1]; //更新差分数组
  for(int i = 0; i < m; i++){
    cin >> l >> r >> c;
    s[l] += c;
    s[r+1] -= c;
  }
  for(int i = 1; i <= n; i++) w[i] = s[i]+w[i-1];
  for(int i = 1; i <= n; i++) cout << w[i] << " " ;
  return 0;
} 

2. 前缀和与差分的综合

【AcWing每日一题】4655. 重新排序

相关文章
|
12天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的自适应学习算法研究与应用
在深度学习领域,传统的静态模型在处理动态环境和非平稳数据时面临挑战。本文探讨了自适应学习算法在深度学习中的重要性及其应用。通过分析自适应学习算法在模型参数、损失函数和数据分布上的应用,展示了其在提升模型鲁棒性和泛化能力方面的潜力。具体讨论了几种代表性的自适应学习方法,并探索了它们在现实世界中的应用案例,从而展示了其在处理复杂问题和动态数据中的效果。
25 0
|
16小时前
|
自然语言处理 算法 搜索推荐
分词算法的基本原理及应用
分词算法的基本原理及应用
|
10天前
|
存储 算法
贪心算法的高逼格应用——Huffman编码
贪心算法的高逼格应用——Huffman编码
27 8
|
6天前
|
存储 自然语言处理 算法
位运算入门及简单算法题的应用
位运算入门及简单算法题的应用
12 1
|
8天前
|
机器学习/深度学习 数据采集 算法
KNN算法原理及应用(一)
**KNN算法**是一种监督学习的分类算法,适用于解决分类问题。它基于实例学习,无需训练过程,当新样本到来时,通过计算新样本与已有训练样本之间的距离,找到最近的K个邻居,然后根据邻居的类别进行多数表决(或加权表决)来预测新样本的类别。K值的选择、距离度量方式和分类决策规则是KNN的关键要素。KNN简单易懂,但计算复杂度随样本量增加而增加,适用于小规模数据集。在鸢尾花数据集等经典问题上表现良好,同时能处理多分类任务,并可应用于回归和数据预处理中的缺失值填充。
KNN算法原理及应用(一)
|
11天前
|
存储 安全 算法
三种常见的加密算法:MD5、对称加密与非对称加密的比较与应用
网络安全聚焦加密算法:MD5用于数据完整性校验,易受碰撞攻击;对称加密如AES快速高效,密钥管理关键;非对称加密如RSA提供身份验证,速度慢但安全。三种算法各有所长,适用场景各异,安全与效率需权衡。【6月更文挑战第17天】
26 2
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】贝叶斯算法在机器学习中的应用与实例分析
【机器学习】贝叶斯算法在机器学习中的应用与实例分析
31 1
|
12天前
|
机器学习/深度学习 算法 Python
【算法】深入浅出爬山算法:原理、实现与应用
【算法】深入浅出爬山算法:原理、实现与应用
22 3
|
12天前
|
传感器 人工智能 运维
智慧电厂转动设备的“非停监测”及算法应用
转动设备故障预测技术在智慧电厂中至关重要,防止非计划停机能避免经济损失和安全风险。结合传统数学模型与AI大数据分析,通过高精度传感器实时监测设备参数,利用智能算法精准预测异常,提前预警潜在故障。AI驱动的模型不仅能识别已知故障,还能预测未知问题,优化维护决策,减少停机时间,降低成本,增强可再生能源设施的运维效率,推动绿色能源转型。
|
12天前
|
机器学习/深度学习 算法 Python
机器学习算法的比较与选择是在实际应用中非常重要的一步,不同的算法适用于不同的问题和数据特征。
机器学习算法的比较与选择是在实际应用中非常重要的一步,不同的算法适用于不同的问题和数据特征。