哈喽,电子朋友们!
我解释一下y总的代码哈
我写出了你们的问题,康康是不是 -<”v * v”>-
#include<iostream>
using namespace std;
const int N = 100010;
int b[N], a[N];
void insert(int l, int r, int c)//重点是这里
{
b[l] += c;//1
b[r + 1] -= c;//2
}//问题:这两行是什么意思呢
//答:在第一个insert的调用中这两行是构建差分数组
因为第一步当i=1,a[1]代入式子1中,可得b1 = a1 + 0写成b1 = a1 - 0吧更好理解
然后当i=2,a[2]代入,再结合第一步的2式和第二步的1式可得b2 = a2 - a1 ...等等
b3 = a3 -a2
..
bn = an -a(n -1);
这样就推出了差分数组
//问题:为什么还要调用insert呢
//答:因为y总说过这是为了保证差分数组累加后形成的数组的部分区间整体加C
int main()
{
int n, m;
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 --)//重复m次操作
{
int l, r, c;
scanf("%d%d%d", &l, &r, &c);
insert(l, r, c);
}
//问题:为什么要循环for要写2次呢
//答:第1个是将差分数组求和得到经历过m次操作的a[]数组的每一个元素
第2个是输出差分数组累加完后得的值
for(int i = 1; i <= n; i ++) b[i] += b[i - 1];//写成b[i] = b[i] +b[i-1]更好理解因为加完后再存到b[i]中
for(int i = 1; i <= n; i ++) printf("%d ", b[i]);
return 0;
}
喜欢就留个言吧,创作不易还需鼓励