题意:
给你一个长度为
M
的数组
题解:
把所有相同的数的位置记在⼀个链表⾥,枚举改哪个数。那么会更改的差值只会是与这些数相邻的数,因此把这些数拿出来,注意如果两个要改的数相邻,必须忽略它。取⼀个数使得它与⼀些数的距离最⼩,必然是这些数的中位数。
/*
ID:Agreement
LANG:C++
*/
// Invincible
#include <bits/stdc++.h>
#define PB push_back
#define rep( i , l , r ) for( int i = (l) ; i <= (r) ; ++i )
#define per( i , r , l ) for( int i = (r) ; i >= (l) ; --i )
#define erep( i , u ) for( int i = head[(u)] ; ~i ; i = e[i].nxt )
using namespace std;
const int maxn = 1e5 + 5;
typedef long long ll;
vector<int> g[maxn];
int a[maxn];
int main(){
int N , M , mx = 0 ;
ll res = 0;
scanf("%d %d" , &N , &M);
rep( i , 1 , M ){
scanf("%d" , &a[i]);
mx = max( mx , a[i] );
if( 1 == i ) continue;
if( a[i] != a[i - 1] ){
g[a[i - 1]].PB( a[i] );
g[a[i]].PB( a[i - 1] );
}
res += (ll)abs( a[i] - a[i - 1] );
}
ll ans = res;
rep( i , 1 , mx ){
ll t = res;
if( 0 == g[i].size() ) continue;
sort( g[i].begin() , g[i].end() );
int mid = g[i][g[i].size() / 2];
rep( j , 0 , g[i].size() - 1 ) t += (ll)( abs(mid - g[i][j]) - abs(i - g[i][j]) );
ans = min( ans , t );
}
cout << ans << endl;
return 0;
}