题目描述
小明拥有 NN 个彩灯,第 ii 个彩灯的初始亮度为 a_ia**i。
小明将进行 QQ 次操作,每次操作可选择一段区间,并使区间内彩灯的亮度 +x+x(xx 可能为负数)。
求 QQ 次操作后每个彩灯的亮度(若彩灯亮度为负数则输出 00)。
输入描述
第一行包含两个正整数 N,QN,Q,分别表示彩灯的数量和操作的次数。
第二行包含 NN 个整数,表示彩灯的初始亮度。
接下来 QQ 行每行包含一个操作,格式如下:
l r x
,表示将区间 l\sim rl∼r 的彩灯的亮度 +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] + " ");
}
}
}