蓝桥杯 - 小明的彩灯 差分数组

题目描述

小明拥有 NN 个彩灯,第 ii 个彩灯的初始亮度为 a_ia**i

小明将进行 QQ 次操作,每次操作可选择一段区间,并使区间内彩灯的亮度 +x+x(xx 可能为负数)。

求 QQ 次操作后每个彩灯的亮度(若彩灯亮度为负数则输出 00)。

输入描述

第一行包含两个正整数 N,QNQ,分别表示彩灯的数量和操作的次数。

第二行包含 NN 个整数,表示彩灯的初始亮度。

接下来 QQ 行每行包含一个操作,格式如下:

l r x,表示将区间 l\sim rlr 的彩灯的亮度 +x+x
在这里插入图片描述

输出描述

输出共 11 行,包含 NN 个整数,表示每个彩灯的亮度。

输入输出样例

示例 1

输入

5 3
2 2 2 1 5
1 3 3
4 5 5
1 1 -100

输出

0 5 5 6 10

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

题解

StreamTokenizer

https://www.cnblogs.com/likailiche/p/4462062.html

本题需要使用StreamTokenizer 作为输入读取,一般用Scanner类来进行输入,但对时间要求严格的题,用它可能会超时。

  • 类java.io.StreamTokenizer可以获取输入流并将其分析为Token(标记)。
    StreamTokenizer的nextToken方法读取下一个标记

  • 为了提高效率,使用BufferedReader

StreamTokenizer st =new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
sc.nextToken();
int n=(int)sc.nval; //st.navl默认解析出的格式是double
查分数组

对于频繁修改数组值有很大帮助

https://cloud.tencent.com/developer/article/1629357

在这里插入图片描述

import java.util.Scanner;
import java.io.*;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) throws IOException {
        StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        sc.nextToken();
        int N = (int)sc.nval;
        sc.nextToken();
        int Q = (int)sc.nval;
        //普通数组
        long a[] = new long[N + 1];
        //差分数组
        long b[] = new long[N + 1];
        //输入 从1开始 方便遍历时候同时获得差分数组
        for(int i = 1; i <= N; i++){
          sc.nextToken();
          a[i] = (long)sc.nval;
          b[i] = a[i] - a[i-1];
        }
        for(int i = 0; i < Q; i++){
          sc.nextToken();
          int l = (int)sc.nval;
          sc.nextToken();
          int r = (int)sc.nval;
          sc.nextToken();
          long x = (long)sc.nval;
          b[l] += x;
          if(r < N) b[r+1] -= x;
        }
        //利用差分数组计算原数组
        for(int j = 1; j <= N; j++){
          a[j] = b[j] + a[j-1];
        }
        //输出
        for(int j = 1; j <= N; j++){
          if(a[j] < 0) a[j] = 0;
          System.out.print(a[j] + " ");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jiong-952

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

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

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

打赏作者

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

抵扣说明:

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

余额充值