Educational Codeforces Round 127 D

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);
}
posted @ 2022-10-13 16:45  ycllz  阅读(25)  评论(0)    收藏  举报