蓝桥杯——小明的彩灯(差分数组)

文章介绍了如何使用差分数组来解决一个关于彩灯亮度变化的问题。在初始状态下,小明有N个亮度为ai的彩灯,会经历Q次操作,每次操作对一段区间的彩灯亮度加x。文章提供了一个C++程序实现,通过构建差分数组来高效处理这些操作,并确保当亮度为负时输出0。
摘要由CSDN通过智能技术生成

差分数组介绍

相关讲解视频链接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例题

题目描述

  • 小明拥有 N 个彩灯,第 i 个彩灯的初始亮度为ai
  • 小明将进行 Q 次操作,每次操作可选择一段区间,并使区间内彩灯的亮度 +x(x 可能为负数)。
  • 求 Q次操作后每个彩灯的亮度(若彩灯亮度为负数则输出 0)。

输入描述

  • 第一行包含两个正整数 N,Q,分别表示彩灯的数量和操作的次数。
  • 第二行包含 NN 个整数,表示彩灯的初始亮度。
  • 接下来 QQ 行每行包含一个操作,格式如下:
    • 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇宙超级无敌霸王龙捏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值