差分数组介绍
例题
题目描述
- 小明拥有 N 个彩灯,第 i 个彩灯的初始亮度为ai
- 小明将进行 Q 次操作,每次操作可选择一段区间,并使区间内彩灯的亮度 +x(x 可能为负数)。
- 求 Q次操作后每个彩灯的亮度(若彩灯亮度为负数则输出 0)。
输入描述
- 第一行包含两个正整数 N,Q,分别表示彩灯的数量和操作的次数。
- 第二行包含 NN 个整数,表示彩灯的初始亮度。
- 接下来 QQ 行每行包含一个操作,格式如下:
- l r x,表示将区间l~r的彩灯的亮度 +x。
- l r x,表示将区间l~r的彩灯的亮度 +x。
输出描述
输出共 11 行,包含 NN 个整数,表示每个彩灯的亮度。
输入输出样例
题解
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
long long N,Q;//数量,操作次数
long long a,b,c;
//arr1--原数组
//arr2--差分数组
long long arr1[500000],arr2[500000];
cin>>N>>Q;
//获取原数组
for(int i=1;i<=N;i++){
cin>>arr1[i];
}
//得到差分数组
for(int i=1;i<=N;i++){
arr2[i]=arr1[i]-arr1[i-1];
}
//基于输入改变差分数组
for(int i=1;i<=Q;i++){
cin>>a>>b>>c;
arr2[a] += c;
arr2[b+1] -= c;
}
//借助差分数组求改后的原数组
for(int i=1;i<=N;i++){
arr1[i]=arr2[i]+arr1[i-1];
}
for(int i=1;i<=N;i++){
if(arr1[i]<0){
arr1[i]=0;
}
}
for(int i=1;i<=N;i++){
cout<<arr1[i]<<" ";
}
return 0;
}