差分数组

写在前面

本部分内容借鉴于Young-children大佬对于差分数组的讲解,感谢大佬。

定义

差分数组类似于求解前缀和,给出原数组为d,差分数组为f,那么有f[i] = d[i] - d[i - 1],据此,可以发现两条差分数组的性质:

  • d[i]等于f[i]的前缀和
  • d[i]的前缀和可以通过如下公式来求得:

用途

差分数组主要支持两种操作:1、区间修改;2、单点查询
根据性质一,可以得到若对某个区间[L, R] 增加一个数 x,只需要使 f[L] += x; f[R + 1] -= x; 即可实现对区间的批量修改,而查询时只需要求前缀和查询单个元素,或者通过上述性质二的公式查询前缀和/区间和即可

备注

实际使用差分数组时,并不一定需要使用源数组构造,可以直接根据区间修改来实现,详见1854. 人口最多的年份,同类型题号如下:370、731、732、995、1094、1109、1526、1589、1674、1854,另外,使用差分数组如果数据范围较大,需要使用TreeMap代替数组实现,本质大同小异

模板

由于差分数组实际上就是一个数组,并不需要什么模板,所以这里粘贴一道题目及题解。题目转自 acwing

题目

代码

import java.util.*;

class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n = input.nextInt() + 1, m = input.nextInt();
        int[] nums = new int[n];
        for(int i = 1; i < n; i++){
            nums[i] = input.nextInt();
        }
        
        int[] f = new int[n + 1];
        for(int i = 1; i < n; i++){
            f[i] = nums[i] - nums[i - 1];
        }
        
        for(int i = 0; i < m; i++){
            int l = input.nextInt(), r = input.nextInt(), c = input.nextInt();
            f[l] += c;
            f[r + 1] -= c;
        }
        
        for(int i = 1; i < n; i++){
            f[i] += f[i - 1];
        }
        
        for(int i = 1; i < n; i++){
            System.out.print(f[i] + " ");
        }
    }
}

推荐阅读更多精彩内容

  • 定义: 对于大小为n的数组arr,定义其差分数组d,差分数组和原来数组arr大小相同,且d[i] = arr[i]...
    forsch阅读 1,629评论 0 2
  • 差分 已知前缀和 S[n], 构造 b[n] 满足条件: S[i] = b1 + b2 + … + b[n] 差分...
    Skymiles阅读 2,011评论 0 0
  • 题目描述小朋友排成一排,老师给他们分苹果。小朋友从左到右标号1..N。有M个老师,每次第i个老师会给第Li个到第R...
    桐桑入梦阅读 300评论 0 1
  • 1. 说明 对范围[first,last)内的元素逐个求差分,并把结果放在result容器中。 x表示范围[fir...
    book_02阅读 903评论 0 1
  • 树状数组是一个查询和修改复杂度都为log(n)的数据结构。主要用于数组的单点修改、区间求和。 lowbit数组 l...
    是我真的是我阅读 834评论 0 0
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 6,791评论 16 21
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 9,762评论 0 10
  • 可爱进取,孤独成精。努力飞翔,天堂翱翔。战争美好,孤独进取。胆大飞翔,成就辉煌。努力进取,遥望,和谐家园。可爱游走...
    赵原野阅读 2,358评论 1 1
  • 在妖界我有个名头叫胡百晓,无论是何事,只要找到胡百晓即可有解决的办法。因为是只狐狸大家以讹传讹叫我“倾城百晓”,...
    猫九0110阅读 2,698评论 7 3