2025-3-30算法打卡

发布于:2025-03-31 ⋅ 阅读:(31) ⋅ 点赞:(0)

一,小明的彩灯

1.题目描述:

题目描述

小明拥有 NN 个彩灯,第 ii 个彩灯的初始亮度为 aiai​。

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

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

输入描述

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

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

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

l r x,表示将区间 l∼rl∼r 的彩灯的亮度 +x+x。

1≤N,Q≤5×1051≤N,Q≤5×105,0≤ai≤1090≤ai​≤109,1≤l≤r≤N1≤l≤r≤N,−109≤x≤109−109≤x≤109

输出描述

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

2.实例:

示例 1

输入

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

输出

0 5 5 6 10

3.思路:

  1. 输入处理:使用BufferedReader读取输入数据,解析出彩灯数量N和操作次数Q

  2. 初始亮度数组:将彩灯的初始亮度存入数组a,索引从1到N。

  3. 差分数组初始化:创建差分数组diff,用于记录区间操作的变化。

  4. 区间操作处理:对于每个区间操作,更新差分数组的相应位置。

  5. 前缀和计算:通过计算差分数组的前缀和,得到每个位置的总增量inc

  6. 结果计算:将初始亮度与总增量相加,处理负数情况,输出结果。

4:代码:

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] line = br.readLine().split(" ");
        int N = Integer.parseInt(line[0]);
        int Q = Integer.parseInt(line[1]);

        int[] a = new int[N + 1];
        line = br.readLine().split(" ");
        for (int i = 1; i <= N; i++) {
            a[i] = Integer.parseInt(line[i - 1]);
        }

        int[] diff = new int[N + 2]; // 差分数组,索引1到N+1

        for (int q = 0; q < Q; q++) {
            line = br.readLine().split(" ");
            int l = Integer.parseInt(line[0]);
            int r = Integer.parseInt(line[1]);
            int x = Integer.parseInt(line[2]);
            diff[l] += x;
            diff[r + 1] -= x;
        }

        // 计算前缀和得到每个位置的增量
        long[] inc = new long[N + 1];
        for (int i = 1; i <= N; i++) {
            inc[i] = inc[i - 1] + diff[i];
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= N; i++) {
            long res = a[i] + inc[i];
            if (res < 0) {
                sb.append(0);
            } else {
                sb.append(res);
            }
            if (i < N) {
                sb.append(' ');
            }
        }
        System.out.println(sb.toString());
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到