AcWing 797. 差分
差分
定义
给定一个原数组 ,构造一个数组 ,使得 。
也就是说, 是 的前缀和数组,我们称 是 的差分数组。
换句话说,差分是前缀和的逆运算。
作用
在 的时间复杂度内将序列中 的一段区间内所有数加上 (减法也一样)。
更具体些
构造差分数组
其实很简单:
//令 a[0] = 0
b[1] = a[1] - a[0];
b[2] = a[2] - a[1];
b[3] - a[3] - a[2];
...
b[n] = a[n] - a[n - 1];
重点!如何实现在 的时间复杂度内将序列中 的一段区间内所有数加上/减去
先放公式:
//这里是加上c的情况
b[l] += c;
b[r + 1] -= c;
为什么这样做?
b[l] += c;
:前面定义说了, 是 的前缀和数组,所以只要改变 , 都会跟着改变;b[r + 1] -= c;
:因为我们只需要改变 , 是多改变的,所以要让这一段 。
个人感觉有点类似于“后缀和”思想。
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = 100010;
int a[N], b[N];
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++ )
{
scanf("%d", &a[i]);
b[i] = a[i] - a[i - 1]; // 预处理出差分数组
}
int l, r, c;
while (m -- )
{
scanf("%d%d%d", &l, &r, &c);
// 按上面的公式执行
b[l] += c;
b[r + 1] -= c;
}
for (int i = 1; i <= n; i ++ )
{
a[i] = b[i] + a[i - 1]; // 差分数组的前缀和是使原数组
printf("%d ", a[i]);
}
return 0;
}
另一种构造方式
上面讲了将 区间内的所有数加 的公式:
b[l] += c;
b[r + 1] -= c;
假设开始时 数组都是 ,所以 数组也都是 。
如果我们要把 初始时设成 ,其实可以看做在 的这段区间中的数加 ,代码如下:
b[i] += c;
b[i + 1] -= c;
第二种构造方式的代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = 100010;
int a[N], b[N];
// 这里把[l, r]区间加c的操作封装成一个函数
void insert(int l, int r, int c)
{
b[l] += c;
b[r + 1] -= c;
}
int main()
{
int n, m, l, r, c;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
for (int i = 1; i <= n; i ++ ) insert(i, i, a[i]); // 初始化差分数组
while (m -- )
{
scanf("%d%d%d", &l, &r, &c);
insert(l, r, c);
}
for (int i = 2; i <= n; i ++ ) b[i] += b[i - 1]; // b的前缀和就是a数组
for (int i = 1; i <= n; i ++ ) printf("%d ", b[i]);
return 0;
}
本文来自博客园,作者:FXT1110011010OI,转载请注明原文链接:https://www.cnblogs.com/FXT1110011010OI/p/16551251.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!