题解:CF1234E Special Permutations
思路
考虑动态维护答案。容易发现
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000000;
int n,m,ans=0,a[N],pos[N];
vector<int> v[N];
void del(int x)
{
for(auto i:v[x])
{
ans-=abs(pos[x]-pos[i]);
}
return;
}
void add(int x)
{
for(auto i:v[x])
{
ans+=abs(pos[x]-pos[i]);
}
return;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>a[i];
}
for(int i=1;i<=m;i++)
{
if(i!=1)
{
v[a[i]].push_back(a[i-1]);
}
if(i!=m)
{
v[a[i]].push_back(a[i+1]);
}
}
for(int i=1;i<=n;i++)
{
pos[i]=i;
}
for(int i=1;i<=n;i++)
{
for(auto j:v[i])
{
ans+=abs(pos[i]-pos[j]);
}
}
ans/=2;
cout<<ans<<" ";
for(int i=2;i<=n;i++)
{
del(i);
del(i-1);
swap(pos[i],pos[i-1]);
add(i);
add(i-1);
cout<<ans<<" ";
}
return 0;
}