一篇文章讲明白差分

Bertha 。 2024-03-31 16:29 152阅读 0赞

一篇文章讲明白差分

题目

输入一个长度为 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

讲解

1.差分是求前缀和的逆操作,对于原数组a[n],构造出一个数组b[n],使a[n]b[n]的前缀和。

2.一般用于快速对整个数组进行操作,比如对将a数组[l,r]部分的数据全部加上c。使用暴力枚举的方法的话,时间复杂至少为O(n),而使用差分算法可以将时间复杂度降低到O(1)

构造数组如下:

  1. a[0 ]= 0;
  2. b[1] = a[1] - a[0];
  3. b[2] = a[2] - a[1];
  4. b[3] =a [3] - a[2];
  5. ........
  6. b[n] = a[n] - a[n-1];

构造代码

  1. for (int i = 1; i <= n; i++)
  2. {
  3. scanf("%d", &a[i]);
  4. b[i] = a[i] - a[i - 1]; //构建差分数组
  5. }

完整提交代码

  1. import java.io.*;
  2. import java.util.*;
  3. public class Main
  4. {
  5. static int N = 100010;
  6. static int [] a = new int [N];
  7. static int [] b = new int [N];
  8. static void insert(int l, int r, int c)
  9. {
  10. b[l] += c;
  11. b[r + 1] -= c;
  12. }
  13. public static void main(String[] args) throws IOException{
  14. BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  15. String [] strs = reader.readLine().trim().split(" ");
  16. int n = Integer.parseInt(strs[0]);
  17. int q = Integer.parseInt(strs[1]);
  18. strs = reader.readLine().trim().split(" ");
  19. for (int i = 1; i <= n; ++ i) {
  20. a[i] = Integer.parseInt(strs[i - 1]);
  21. insert(i, i, a[i]);
  22. }
  23. while(q -- > 0)
  24. {
  25. int l, r, c;
  26. strs = reader.readLine().trim().split(" ");
  27. l = Integer.parseInt(strs[0]);
  28. r = Integer.parseInt(strs[1]);
  29. c = Integer.parseInt(strs[2]);
  30. insert(l, r, c);
  31. }
  32. for (int i = 1; i <= n; ++ i) a[i] = a[i - 1] + b[i];
  33. for (int i = 1; i <= n; ++ i) System.out.print(a[i] + " ");
  34. }
  35. }

发表评论

表情:
评论列表 (有 0 条评论,152人围观)

还没有评论,来说两句吧...

相关阅读

    相关 文章明白

    一篇文章讲明白差分 题目 输入一个长度为 n 的整数序列。 接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 \[l,r\] 之间的每个数加