源代码:
#include<cstdio>
#include<vector>
#include<algorithm>
#define LL long long
using namespace std;
LL n,m,Ans(0),Sum(0),i[100001];
vector <LL> Q[100001];
int main()
{
scanf("%I64d%I64d",&n,&m);
for (LL a=1;a<=m;a++)
scanf("%I64d",&i[a]);
for (LL a=1;a<=m;a++)
{
if (a>1&&i[a-1]!=i[a])
Q[i[a-1]].push_back(i[a]); //相邻关系。
if (a<m&&i[a+1]!=i[a])
Q[i[a+1]].push_back(i[a]);
}
for (LL a=1;a<=n;a++)
{
if (!Q[a].size())
continue;
sort(Q[a].begin(),Q[a].end());
LL T=Q[a][Q[a].size()>>1];
LL T1(0),T2(0);
for (LL b=0;b<Q[a].size();b++)
{
T1+=abs(a-Q[a][b]);
T2+=abs(T-Q[a][b]);
}
Ans=max(Ans,T1-T2);
Sum+=T1;
}
printf("%I64d",(Sum>>1)-Ans); //注意数据类型。
return 0;
}
/*
一道很奇怪的题,但也是挺理性的题。
发现,对答案有影响的是其相邻数,链表存储。
易得,中位数最优,排序取中位数(偶数对答案贡献相同),取最大贡献即可。
做题应该从理性的角度出发,分析应该分析的内容,然后思考解法。
看似时间复杂度较高,其实想想,它有一部分被均分了。
*/