D. Insert a Progression
思路:本题要发现只要插好1和x后,其余的数插到数组里面是不会产生贡献的。所以现在的问题转化为1和x怎么差产生的贡献最少?
设原数组中最小的值为
m
i
n
min
min,最大的值为
m
a
x
max
max。
如果
1
=
=
m
i
n
1 == min
1==min则可以把1放在最小值边上不会产生贡献,同理把x < max,也不会产生贡献。
考虑
x
>
m
a
x
x > max
x>max 和
1
<
m
i
n
1 < min
1void solve()
{
scanf("%d %d",&n,&x);
vectora;
LL ans = 0;
for(int i = 1; i <= n; i ++ ){
int xx;
cin >> xx;
a.pb(xx);
}
int sa = sz(a);
for(int i = 0; i + 1 < sa; i ++ ){
ans += abs(a[i + 1] - a[i]);
}
int xx = *max_element(all(a)), yy = *min_element(all(a));
int q = min({abs(1 - yy) * 2, abs(1 - a.front()), abs(1 - a.back())});
int p = 0;
if(xx < x) p = min({abs(x - xx) * 2, abs(x - a.front()), abs(x - a.back())});
ans += p + q;
cout << ans << endl;
}