题目链接
思路:可以模拟一下P的变化,发现一个规律,假设当前为第i轮,那个这一轮要变的数就是i和i-1,要变成1,i-1要变成i,我们模拟一下这个变化过程,暴力修改每个数的值。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+1;
ll a[maxn],ans=0,p[maxn];
vector<int>v[maxn];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) p[i]=i;
for(int i=1;i<=m;++i) scanf("%lld",&a[i]),v[a[i]].push_back(i);
for(int i=2;i<=m;++i) ans+=abs(a[i]-a[i-1]);
printf("%lld ",ans);
for(int i=2;i<=n;++i)
{
for(int j=0;j<v[i].size();++j)
{
int k=v[i][j];
if(k>1) ans-=abs(i-p[a[k-1]]);
if(k<m) ans-=abs(i-p[a[k+1]]);
}
for(int j=0;j<v[i-1].size();++j)
{
int k=v[i-1][j];
if(k>1) ans-=abs(1-p[a[k-1]]);
if(k<m) ans-=abs(1-p[a[k+1]]);
}
p[i]=1,p[i-1]=i;
for(int j=0;j<v[i].size();++j)
{
int k=v[i][j];
if(k>1) ans+=abs(1-p[a[k-1]]);
if(k<m) ans+=abs(1-p[a[k+1]]);
}
for(int j=0;j<v[i-1].size();++j)
{
int k=v[i-1][j];
if(k>1) ans+=abs(i-p[a[k-1]]);
if(k<m) ans+=abs(i-p[a[k+1]]);
}
printf("%lld ",ans);
}
}