D. Insert a Progression
显然我们可以对a1——a2之间的数全部都插入期间 显然是没有贡献的
并且我们我们的1-x 只用维护最小1 和 最大x 即可
显然要是我们要是mn中没有1 我们要让1插进去
当插头尾的时候只有一边贡献 中间就会有左右两边贡献
这样我们处理了1 我们再判断mx是不是大于x再看做不做x
这样就会少一个特判n==1
显然我们做x 做1的顺序是无关的
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
const int M = 998244353;
const int mod = 998244353;
#define int long long
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
void solve() {
int n,x;cin>>n>>x;
vector<int>a(n+1);
int mx=-INF,mn=INF,sum=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(i>1)sum+=abs(a[i]-a[i-1]);
mx=max(mx,a[i]);
mn=min(mn,a[i]);
}
int ans=INF;
if(mn>=1){
ans=min({ans,abs(a[1]-1),abs(a[n]-1)});
for(int i=2;i<=n;i++){
ans=min(ans,min(abs(a[i-1]-1),abs(a[i]-1))*2);
}
}
sum+=ans;
ans=INF;
if(mx>=x){
cout<<sum<<endl;return;
}
ans=min({ans,abs(a[1]-x),abs(a[n]-x)});
for(int i=2;i<=n;i++){
ans=min(ans,min(abs(a[i-1]-x),abs(a[i]-x))*2);
}
cout<<sum+ans<<endl;
}
signed main(){
fast
int t;t=1;cin>>t;
while(t--) {
solve();
}
return ~~(0^_^0);
}
标签:Educational,const,int,mn,Codeforces,ans,127,INF,mx
From: https://www.cnblogs.com/ycllz/p/16788728.html