Insert a Progression
You are given a sequence of n n n integers a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,…,an. You are also given x x x integers 1 , 2 , … , x 1, 2, \dots, x 1,2,…,x.
You are asked to insert each of the extra integers into the sequence a a a. Each integer can be inserted at the beginning of the sequence, at the end of the sequence, or between any elements of the sequence.
The score of the resulting sequence a ′ a' a′ is the sum of absolute differences of adjacent elements in it ( ∑ i = 1 n + x − 1 ∣ a i ′ − a i + 1 ′ ∣ ) \left(\sum \limits_{i=1}^{n+x-1} |a'_i - a'_{i+1}|\right) (i=1∑n+x−1∣ai′−ai+1′∣).
What is the smallest possible score of the resulting sequence a ′ a' a′?
Input
The first line contains a single integer t t t ( 1 ≤ t ≤ 1 0 4 1 \le t \le 10^4 1≤t≤104) — the number of testcases.
The first line of each testcase contains two integers n n n and x x x ( 1 ≤ n , x ≤ 2 ⋅ 1 0 5 1 \le n, x \le 2 \cdot 10^5 1≤n,x≤2⋅105) — the length of the sequence and the number of extra integers.
The second line of each testcase contains n n n integers a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,…,an ( 1 ≤ a i ≤ 2 ⋅ 1 0 5 1 \le a_i \le 2 \cdot 10^5 1≤ai≤2⋅105).
The sum of n n n over all testcases doesn’t exceed 2 ⋅ 1 0 5 2 \cdot 10^5 2⋅105.
Output
For each testcase, print a single integer — the smallest sum of absolute differences of adjacent elements of the sequence after you insert the extra integers into it.
Example
i n p u t \tt input input |
---|
4 1 5 10 3 8 7 2 10 10 2 6 1 5 7 3 3 9 10 10 1 4 10 1 3 1 2 |
o u t p u t \tt output output |
9 15 31 13 |
Tutorial
由题意易得,对于数组 a a a 中已有的数不能改变,此时差值为 ∑ i = 1 ∣ a ∣ a b s ( a i − a i − 1 ) \sum_{i = 1}^{|a|}abs(a_i - a_{i - 1}) ∑i=1∣a∣abs(ai−ai−1),其中 ∣ a ∣ |a| ∣a∣ 表示数组 a a a 的长度
在任意两个数 a i a_i ai 和 a i + 1 a_{i + 1} ai+1 之间,满足 a i ≤ x ≤ a i + 1 a_i \le x \le a_{{i + 1}} ai≤x≤ai+1 条件的 x x x 对答案都不会产生影响,因此插入满足 min ( a ) ≤ x ≤ max ( a ) \min(a) \le x \le \max(a) min(a)≤x≤max(a) 条件的 x x x 均不会对答案产生影响,我们只需要考虑小于 min ( a ) \min(a) min(a) 的数和大于 max ( a ) \max(a) max(a) 的数对答案会产生什么影响即可
对于小于 min ( a ) \min(a) min(a) 的数:
- 如果将 1 , 2 , … , min ( a ) − 1 1,2,\dots,\min(a) - 1 1,2,…,min(a)−1 正序插入到整个数列 a a a 的最前方,产生的影响为 a b s ( a 0 − 1 ) abs(a_0 - 1) abs(a0−1)
- 如果将 min ( a ) − 1 , min ( a ) − 2 , … , 2 , 1 \min(a) - 1, \min(a) - 2, \dots, 2, 1 min(a)−1,min(a)−2,…,2,1 倒序插入到整个数列 a a a 的最后方,产生的影响为 a b s ( a ∣ a ∣ − 1 ) abs(a_{|a|} - 1) abs(a∣a∣−1),其中 ∣ a ∣ |a| ∣a∣ 表示数组 a a a 的长度
- 如果将 1 , 2 , … , min ( a ) − 1 1,2,\dots,\min(a) - 1 1,2,…,min(a)−1 按序插入到数组 a a a 中间,产生的影响为 ( min ( a ) − 1 ) × 2 (\min(a) - 1) \times 2 (min(a)−1)×2
对于大于 max ( a ) \max(a) max(a) 的数:
- 如果将 x − 1 , x − 2 , … , max ( a ) + 1 x - 1, x - 2, \dots, \max(a) + 1 x−1,x−2,…,max(a)+1 倒序插入到整个数列 a a a 的最前方,产生的影响为 a b s ( x − a 0 ) abs(x - a_0) abs(x−a0)
- 如果将 max ( a ) + 1 , max ( a ) + 2 , … , x \max(a) + 1,\max(a) + 2,\dots,x max(a)+1,max(a)+2,…,x 正序插入到整个数列 a a a 的最后方,产生的影响为 a b s ( x − a ∣ a ∣ ) abs(x - a_{|a|}) abs(x−a∣a∣),其中 ∣ a ∣ |a| ∣a∣ 表示数组 a a a 的长度
- 如果将
1
,
2
,
…
,
min
(
a
)
−
1
1,2,\dots,\min(a) - 1
1,2,…,min(a)−1 按序插入到数组
a
a
a 中间,产生的影响为
(
x
−
max
(
a
)
)
×
2
(x - \max(a)) \times 2
(x−max(a))×2,当然,如果
max
(
a
)
>
x
\max(a) > x
max(a)>x,此时影响为
0
综上所述,对于每一个数组 a a a 和 x x x,答案为
{ ∑ i = 1 ∣ a ∣ a b s ( a i − a i − 1 ) min ( a b s ( x − a 0 ) , a b s ( x − a ∣ a ∣ ) , max ( 0 , ( x − max ( a ) ) × 2 ) ) min ( a b s ( a 0 − 1 ) , a b s ( a ∣ a ∣ − 1 ) , ( min ( a ) − 1 ) × 2 ) \left\{\begin{matrix} \sum_{i = 1}^{|a|}abs(a_i - a_{i - 1}) \\ \min(abs(x - a_0), abs(x - a_{|a|}), \max(0, (x - \max(a)) \times 2)) \\ \min(abs(a_0 - 1), abs(a_{|a|} - 1), (\min(a) - 1) \times 2) \end{matrix}\right. ⎩ ⎨ ⎧∑i=1∣a∣abs(ai−ai−1)min(abs(x−a0),abs(x−a∣a∣),max(0,(x−max(a))×2))min(abs(a0−1),abs(a∣a∣−1),(min(a)−1)×2)
的和
此解法时间复杂度为 O ( n ) \mathcal O(n) O(n),即求 ∑ i = 1 ∣ a ∣ a b s ( a i − a i − 1 ) \sum_{i = 1}^{|a|}abs(a_i - a_{i - 1}) ∑i=1∣a∣abs(ai−ai−1) 时的时间复杂度
Solution
import sys
input = lambda: sys.stdin.readline().strip()
output = []
for _ in range(int(input())):
n, x = map(int, input().split())
a = list(map(int, input().split()))
ans = sum(abs(a[i] - a[i + 1]) for i in range(n - 1))
mx, mn = max(a), min(a)
up = min(abs(x - a[0]), abs(x - a[-1]), (0 if mx > x else (x - mx) * 2))
down = min(abs(a[0] - 1), abs(a[-1] - 1), (mn - 1) * 2)
output.append(ans + up + down)
print('\n'.join(map(str, output)))