差分
差分
相关题目
输入一个长度为 nn 的整数序列。
接下来输入 mm 个操作,每个操作包含三个整数 l,r,cl,r,c,表示将序列中 [l,r][l,r] 之间的每个数加上 cc。
请你输出进行完所有操作后的序列。
输入格式
第一行包含两个整数 nn 和 mm。
第二行包含 nn 个整数,表示整数序列。
接下来 mm 行,每行包含三个整数 l,r,cl,r,c,表示一个操作。
输出格式
共一行,包含 nn 个整数,表示最终序列。
数据范围
1≤n,m≤1000001≤n,m≤100000,
1≤l≤r≤n1≤l≤r≤n,
−1000≤c≤1000−1000≤c≤1000,
−1000≤整数序列中元素的值≤1000−1000≤整数序列中元素的值≤1000
输入样例:
1 | 6 3 |
输出样例:
1 | 3 4 5 3 4 2 |
算法思想
差分可以用于计算其中任意一段数组的加减,并且每次加减时间控制在O(1)
差分是前缀和的逆运算(前缀和是预先知道a[n],后计算S[n],以达到可以在O(1)时间段内,计算任意一段数据的和的目的)
前置条件:假设原来给定数组为S[n](或自己计算出S[n]),则计算差分数组可以为**a[n] = S[n]-S[n-1]**。
计算基础:计算让原来的素组任意一段加减一个常数c,相当于S[l~r]-c
核心计算:要知道某一段前缀和数据S[l~r]突然全部加了相同的一个数,可以被看做a[n]中的一个数据加了c而导致的连锁效应,而且S[0 ~ l-1],S[r+1
n]两段数据值没有改变,那我们就可以把**S[lr]+c**这个过程简化为 a[l]+c, a[r+1]-c,这样复杂度就瞬间见下降。
笔者代码
1 | import java.util.Scanner; |
相关简单题
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 随意!
评论
ValineDisqus





