您的位置:首页 > 科技 > 能源 > 算法题目杂记

算法题目杂记

2024/9/29 6:05:51 来源:https://blog.csdn.net/dukongjian/article/details/141506484  浏览:    关键词:算法题目杂记

差分

来源 https://www.acwing.com/problem/content/799/

题目

输入一个长度为 n的整数序列。 接下来输入 m个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加 c。
请你输出进行完所有操作后的序列。

输入格式

第一行包含两个整数 n和 m。 第二行包含 n个整数,表示整数序列。 接下来 m行,每行包含三个整数 l,r,c,表示一个操作。

输出格式

共一行,包含 n个整数,表示最终序列。

数据范围

1≤n,m≤100000,
1≤l≤r≤n,
−1000≤c≤1000,
−1000≤整数序列中元素的值≤1000

输入样例:

6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1

输出样例:

3 4 5 3 4 2

解答

构造差分数组来模拟计算过程,而不是直接在原数组上计算

package acwing;import java.util.Scanner;public class Acwing797 {public static void test(int[] b, int i, int j, int c) {b[i] += c;if (j + 1 < b.length) {b[j + 1] -= c;}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();int[] f = new int[n];int[] b = new int[n];int i = 0;while (n > 0) {f[i] = sc.nextInt();n--;test(b, i, i, f[i]);i++;}while (m > 0) {int l = sc.nextInt();int r = sc.nextInt();int c = sc.nextInt();test(b, l - 1, r - 1, c);m--;}sc.close();for (int j = 0; j < b.length; j++) {if (j == 0) {f[j] = b[j];} else {f[j] = f[j - 1] + b[j];}System.out.print(f[j] + " ");}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com