小明有N个彩灯,第i个彩灯的初始亮度为 ai,小明将进行 Q 次操作,每次操作可选择一段区间,并使区间内彩灯的亮度 +x,(x可能为负数)
求Q次操作后每个彩灯的亮度(若彩灯亮度为负数则输出0)
输入
第一行包含两个正整数N,Q,分别表示彩灯的数量和操作的次数
第二行包含N个整数,表示彩打的初始亮度
接下来Q 行每行包含一个操作,格式如下
l r x 表示区间 l ~ r 的彩灯亮度+x
分析此题可以发现题目要求在一段区间内将区间的数发生修改,可以用差分数组对数组a进行区间修改,注意输出时亮度如果为负数则输出0,需要开longlong.
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = les+1;
ll a[N],d[N];
void solve(){
int n,m,cin>>n>>m;
for(int i=1;i<n,i++)cin>>a[i];
for(int i=1;i<n;i++)d[i] = a[i]-a[i-1];//差
while(n--){ //差分
int l,r,x;cin>>l>>r>>x;
d[i] += x;
d[r+1] -= x;
}
for(int i=1;i<=n;++i)a[i] = a[i-1]+d[i]; //求前缀和
for(int i=1;i<=n;++i) cout<<max(0ll,a[i])<<'\n';
}
int main(){
solve();
return 0 ;
}
这边先求了差分,区间统一增加x, 接着求前缀和,整合出新的a数组
max(0ll, a[i])
表示将 a[i]
和 0
中较大的值作为结果返回,并且 0
的类型被明确指定为 long long
。因此,oll
在这段代码中是用来表示 long long
类型的整数