题目描述
输入一个长度为n的整数序列。
接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。
请你输出进行完所有操作后的序列。
输入格式
第一行包含两个整数n和m。
第二行包含n个整数,表示整数序列。
接下来m行,每行包含三个整数l,r,c,表示一个操作。
输出格式
共一行,包含n个整数,表示最终序列。
数据范围
1≤n,m≤100000,
1≤l≤r≤n,
−1000≤c≤1000,
−1000≤整数序列中元素的值≤1000
样例
输入样例:
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
输出样例:
3 4 5 3 4 2
(差分法)
C++ 代码
#include<iostream>
#include<vector>
using namespace std;
vector<int> s(100010,0),b(100010,0);
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>s[i];//存放原数组
// for(int i=1;i<=n;i++) cout<<s[i]<<' ';
// cout<<endl;
for(int i=1;i<=n;i++) b[i] = s[i]-s[i-1];//构造差分数组
// for(int i=1;i<=n;i++) cout<<b[i]<<' ';
// cout<<endl;
while(m--){
int l,r,c;
cin>>l>>r>>c;
b[l]+=c;//将l和以后加c
b[r+1]-=c;//将r之后-c
}
// for(int i=1;i<=n;i++) cout<<b[i]<<' ';
// cout<<endl;
for(int i=1;i<=n;i++){
b[i]=b[i-1]+b[i];//将差分改为原数组
cout<<b[i]<<' ';
}
return 0;
}
救了我一命,我看了y总的解法,一直看不懂,理解不透,火的劳资差点把电脑咋了
暴 躁 老 哥
害 怕 .exe
害怕
我不太明白
b[i] = b[i - 1] + b[i]
是如何实现b[n]数组的输出的,有大佬讲解一下吗?就类似于前缀和这里b[i]输出后就是改变后的数组,a[i]=a[i-1]+b[i],a[i]=b[1]+....+b[i]==>立即推b[i]=b[ i-1]+b[i]。
老哥,能再细说一下不?
b[1] = s[1];
b[2] = s[2] - s[1]; 所以b[2] + b[1] = s[2] 这个s[ ] 不就是原函数,只是把s[ ] 换成 b[ ]
我也是一个for循环一个输出就搞懂了
这个好理解一些,赞
非常感谢,y总的那个插入的操作实在是看不懂,还是按照差分数组的基本原理进行构造比较直观
学习总结了一、二维前缀和差分,希望对你有帮助~
https://blog.csdn.net/m0_74215326/article/details/129620912?spm=1001.2014.3001.5502
#include[HTML_REMOVED]
using namespace std;
const int N=1e5+8;
int main(){
int n,m,l,r,c;
int a[N],b[N];
cin>>n>>m;
for(int i=1;i<=n;i)cin>>a[i];
while(m–){
cin>>l>>r>>c;
b[l]+=c;
b[r+1]-=c;
}
for(int i=1;i<=n;i){
b[i]=b[i-1]+b[i];
}
for(int i=1;i<=n;i){
a[i]+=b[i];
}
for(int i=1;i<=n;i){
cout<<a[i]<<” “;
}
}
求大佬查错
不错不错,还原回去,秒啊秒啊
只能说,终于懂了
舒服了,多谢大佬!
比y总的好懂诶,y总的插入让我懵逼
terrible
或许我真的弄懂这个差分了!
看懂了。。多谢分享~
请问为什么i要从1开始,从0开始就错了?
i-1的时候会越界呀
感觉比y总的思想好懂,蟹蟹
可以的!
非常感谢你的题解,下面这里我想请教一下:
b[l]+=c;//将l和以后加c
b[r+1]-=c;//将r之后-c
是不是应该理解为a[]的l和以后加c,r以后-c。
不是的,因为 a 是 b 的前缀和数组,所以 b[l] += c 后,此时若再求其前缀和数组,得到的 a 就是从 l 后每个数都加上了 l,因为 a[i] (i >= l) 都需要加一次 b[l]
其实可以这么想,你想如果在前缀和数组中插入在[l,r]中插入一个c,实际上在差分数组中收到影响的只有位置为l的以及位置是r+1,这两个位置上的数
yxc那个从0开始构造那步看了至少四遍,没看明白
我看了三遍了也没懂
A 0000000
B 0000000
然后
A 1000000
B 1 -1 0 0 0 0
A仍然是B的前缀和
然后 A再多一个数
A 1 2 0000
B 1 1 -1 000
A仍然是B的前缀和
终于懂了,谢谢dl
可是题目中A数组不是00000 B数组也是随机值啊
确实 $B$数组都没有初始化
困扰了一年的差分,懂了,万分感谢!
懂了,谢谢