一篇文章讲明白差分

简介: 一篇文章讲明白差分

一篇文章讲明白差分

题目

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

构造数组如下:

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

构造代码

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

完整提交代码:

import java.io.*;
import java.util.*;
public class Main
{
    static int N = 100010;
    static int [] a = new int [N];
    static int [] b = new int [N];
    static void insert(int l, int r, int c)
    {
        b[l] += c;
        b[r + 1] -= c;
    }
    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String [] strs = reader.readLine().trim().split(" ");
        int n = Integer.parseInt(strs[0]);
        int q = Integer.parseInt(strs[1]);
        strs = reader.readLine().trim().split(" ");
        for (int i = 1; i <= n; ++ i) {
            a[i] = Integer.parseInt(strs[i - 1]);
            insert(i, i, a[i]);
        }
        while(q -- > 0)
        {
            int l, r, c;
            strs = reader.readLine().trim().split(" ");
            l = Integer.parseInt(strs[0]);
            r = Integer.parseInt(strs[1]);
            c = Integer.parseInt(strs[2]);
            insert(l, r, c);
        }
        for (int i = 1; i <= n; ++ i) a[i] = a[i - 1] + b[i];
        for (int i = 1; i <= n; ++ i) System.out.print(a[i] + " ");
    }
}
相关文章
|
6月前
|
编解码 开发工具 git
技术心得记录:小波变换(wavelettransform)的通俗解释(一)
技术心得记录:小波变换(wavelettransform)的通俗解释(一)
55 0
|
7月前
|
数据安全/隐私保护
matlab批量计算地震加速度反应谱、速度谱、位移谱,伪速度谱、伪加速度谱;反应谱对比图
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
|
机器学习/深度学习 传感器 数据采集
【信号处理教程】基于倒谱图判断浊音的基音周期附MATLAB代码
【信号处理教程】基于倒谱图判断浊音的基音周期附MATLAB代码
|
算法 索引 Python
从一道简单算法题里面解释什么叫做 O(1)
从一道简单算法题里面解释什么叫做 O(1)
123 0
|
算法 量子技术
从实际代码出发了解量子相位估计算法的原理
从实际代码出发了解量子相位估计算法的原理
307 0
|
数据安全/隐私保护
【数字IC手撕代码】Verilog伪随机数生成器|线性反馈移位寄存器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog伪随机数生成器|线性反馈移位寄存器|题目|原理|设计|仿真
【数字IC手撕代码】Verilog伪随机数生成器|线性反馈移位寄存器|题目|原理|设计|仿真
|
机器学习/深度学习 传感器 算法
【解包裹】基于可靠性直方图处理的快速二维相位展开算法附matlab代码和论文
【解包裹】基于可靠性直方图处理的快速二维相位展开算法附matlab代码和论文
|
机器学习/深度学习
划重点!通俗解释协方差与相关系数
划重点!通俗解释协方差与相关系数
564 1
划重点!通俗解释协方差与相关系数
|
程序员
程序员数学(22)–二次函数的图象与性质
本文目录 1. 定义 2. y=ax^2图象与性质 3. y=a(x-h)^2+k图象和性质 3.1 k值对图象的影响 3.2 h值对图象的影响 3.3 a值对图象的影响 4. y=ax^2+bx+c图象与性质 5. 二次函数与一元二次方程
296 0
程序员数学(22)–二次函数的图象与性质
|
算法 Serverless
【计算理论】图灵机 ( 图灵机引入 | 公理化 | 希尔伯特纲领 | 哥德尔不完备定理 | 原始递归函数 )
【计算理论】图灵机 ( 图灵机引入 | 公理化 | 希尔伯特纲领 | 哥德尔不完备定理 | 原始递归函数 )
283 0