目录
一:差分
差分类似于前缀和的逆运算
二: 差分数组的详细描述
首先我们构造一个数组a:a【1】,a【2】,······,a【n】
在构造一个数组b:b【1】,b【2】,······,b【n】
我们让两个数组的关系为:a【i】= b【1】+b【2】+······+b【i】
显然,a数组是b数组的前缀和,因此,我们称b数组是a数组的差分数组
如何构造如下的差分数组b?
显然,这个问题很简单,在输入的时候处理一下就好
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
b[i] = a[i] - a[i - 1]; //构建差分数组
}
三:差分的实现方式
先给出一个图帮助理解
很显然,对b数组的l位置加c,那么a【l】之后的所有值都会加上c,但是有时候题目不要求把l之后的所有数字都加上c,可能到r就截止,因此这时候我们在b【r+1】的位置减c即可
四:题目描述
五:万年无误代码模板(全网最易懂模板)
#include <iostream>
using namespace std;
const int N = 100010;
int n, m;
int a[N], b[N];
void insert(int l, int r, int c)
{
b[l] += c;
b[r + 1] -= c;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
b[i] = a[i] - a[i - 1]; //构建差分数组
}
while (m -- )
{
int l, r, c;
scanf("%d%d%d", &l, &r, &c);
insert(l, r, c);
}
for (int i = 1; i <= n; i++)
{
a[i] = b[i] + a[i - 1]; //前缀和运算
printf("%d ", a[i]);
}
return 0;
}
创作不易,建议点赞+收藏+关注,以免变成付费资源或者找不到宝贝文章了。
基础集训结束后将开展拔高系列