本题需要多次查询序列某个区间内相邻元素之差的绝对值之和(称为波动和)。若直接对每个查询遍历区间求和,时间复杂度为 O(n×q),在 n,q≤105 时会超时。我们可以利用前缀和技巧将单次查询优化到 O(1)。
定义辅助数组
令 diff[i] = |a[i] - a[i-1]|,表示第 i−1 个数据与第 i 个数据之间的波动贡献(采用 0 基下标时,diff[1] 对应于 ∣a2−a1∣,以此类推)。
构建前缀和数组
定义 pre[i] 表示前 i 个相邻差值的总和,即:
在数据分析中,工程师小蓝采集了一组随时间变化的数据序列。为了衡量一段连续时间段内数据的波动程度,定义该时间段内相邻两个采集点之差的绝对值之和为“波动和”。现在小蓝需要快速回答多次关于不同时间区间的波动和查询。
给定一个长度为 n 的序列 a1,a2,…,an。对于区间 [l,r],其波动和定义为 ∑i=lr−1∣ai−ai+1∣。若区间长度为 1(即 l=r),规定波动和为 0。请你帮助小蓝高效地回答多次查询。
数据规模:序列长度 n 与查询次数 q 均不超过 105;序列中的每个数值 ai 满足 1≤ai≤109;每次查询的区间 [l,r] 满足 1≤l≤r≤n。
第一行包含一个正整数 n,表示序列的长度。 第二行包含 n 个正整数 a1,a2,…,an,相邻数字之间以空格分隔。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.