每日一题 差分 小明的彩灯

小明有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 类型的整数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值