B. Suffix Operations
传送门
后缀+1,后缀-1
操作前可以改变一个值
求最少操作数使得数组值相等
在不考虑改变一个值的情况下就等于差分数组的绝对值求和
差分数组b[i]
考虑可以改变一个值,(使得当前值与后者或前者相等):
情况1 、改变a[1],使得a[1]==a[2],可减少操作数d=abs(a[2]-a[1]);
情况2、改变a[n],使得a[n]==a[n-1], 可减少操作数d=abs(a[n]-a[n-1]);
情况3、改变a[i],可减少操作数d=b[i]+b[i-1]-abs(a[i]-a[i-2]);
差分和减去最大的d即可:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=200010;
int t,n,m;
long long int a[N],b[N];
int main()
{
cin>>t;
int x,y;
while(t--){
cin>>n;
long long int d=0,sum=0;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=abs(a[i]-a[i-1]);
if(i>2) d=max(d,b[i]+b[i-1]-abs(a[i]-a[i-2])); //情况3
}
d=max(d,b[2]); //情况1
d=max(d,b[n]); //情况2
for(int i=2;i<=n;i++) sum+=b[i];
sum-=d;
cout<<sum<<endl;
}
return 0;
}