1671D Insert a Progression
先找到序列中最小最大的值,一定存在某种插入情况使得minn~maxn的数 不会对原序列产生贡献
对于1~minn-1 的数,分类讨论,首中尾
对于首尾,整体来看只有一边产生贡献,可得最小贡献为
a
1
−
1
a_1-1
a1−1(首),
a
n
−
1
a_n-1
an−1(尾)
对于中 ,贪心的想,整体一定要夹在两个minn之间,反证左右minn值减小或增加可证 产生贡献
2
∗
(
m
i
n
n
−
1
)
2*(minn-1)
2∗(minn−1)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
void solve(){
int n,x;
cin>>n>>x;
vector<int> a(n+1);
int minn=1e9,maxn=0;
ll ans=0;
for (int i=1;i<=n;i++){
cin>>a[i];
maxn=max(maxn,a[i]);
minn=min(minn,a[i]);
if (i>1) ans+=abs(a[i]-a[i-1]);
}
if (minn>1){
ans+=min(2*(minn-1),min(a[1]-1,a[n]-1));
}
if (maxn<x){
ans+=min(2*(x-maxn),min(x-a[1],x-a[n]));
}
cout<<ans<<"\n";
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while (t--){
solve();
}
return 0;
}