对Y总做法非常详细的解释
C++ 代码
/*
输入一个长度为 n的整数序列。
接下来输入 m个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c。
请你输出进行完所有操作后的序列。
输入格式
第一行包含两个整数 n和 m。
第二行包含 n个整数,表示整数序列。
接下来 m行,每行包含三个整数 l,r,c,表示一个操作。
输出格式
共一行,包含 n个整数,表示最终序列。
*/
//注!!!根据题意,如果直接来做的话,需要在l, r之间对 a[]都进行一次加上c的操作,所以操作很多,容易超时
//而利用差分数组来做就很简单,因为在差分数组的某个位置加上c,还原成前缀和数组后,前缀和数组这个位置和之后的所有位置都会加上c
//所以,在l处加上c,在r+1处减去c,这样还原得到前缀和数组的 l~r 位置的数都会加上c
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 100010;
int n, m;
int a[N], b[N];
void insert(int l, int r, int c) // b[] 是 a[]的差分数组, 就是构建一个b[],使得 a[]是b[]的前缀和
{
//对于初始构建b[],需要insert( i,i,a[i])
//可见,只有b[1] = a[1],对于不为 1 的下标 i,b[i] = a[i] - a[i - 1]
//例如,b[1] = a[1],b[2] = a[2] - a[1], b[3] = a[3] - a[2],所以b是a的差分数组
//对于想要下标 l 和 r 之间的 a[] 加上c
//因为a是b的前缀和,所以若 b[i] 加上一个数 c,则下标大于等于 i 的a[]都会加上c
// 所以,则要让 b[l] += c, b[r + 1] -= 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]);
for(int i = 1; i <= n; i++) insert(i, i, a[i]);
while(m--)
{
int l, r, c;
scanf("%d%d%d", &l, &r, &c);
insert(l, r, c);
}
for(int i = 1; i <= n; i++) b[i] += b[i - 1]; //这一步是求操作完之后的数组 a[],因为直接用b[]求前缀和比较方便,所以直接用b写了
for(int i = 1; i <= n; i++) printf("%d", b[i]);
return 0;
}
看不懂啊老哥 y总这个插入我理解不到啊