当我们考虑修改某个元素的时候,假设修改的元素是 ar [x] (x>1 && x < n)这个时候我们减少的操作次数为 cnt= abs (a [x] - a [x + 1) + abs (a [x] - a [x-1]) - abs (a [x-1] - a [x+1]), 那么我们可以枚举所有的可能的 x,的到最大减少次数 mxn_cnt,
那答案是 sum - mxn_cnt.
最后在特判一下 首元素 a [1] 变成 a [2] 时候的答案,
最后在特判一下 尾元素 a [n] 变成 a [n-1] 时候的答案,
维护一下所有的答案的最大值,就行了
#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<string>#include<string>#include<map>#include<bitset>#include<vector>voidfre(){system("clear"),freopen("A.txt","r",stdin);freopen("Ans.txt","w",stdout);}voidFre(){system("clear"),freopen("A.txt","r",stdin);}voidRun(int x =0){#ifdef ACM //宏定义免注释 freopenif(! x)fre();elseFre();#endif}#define ios ios::sync_with_stdio(false)#define Pi acos(-1)#define pb push_back#define fi first#define se second#define db double#define ll long long#define ull unsigned long long#define Pir pair<ll, ll>#define m_p make_pair#define for_(i, s, e) for(ll i = (ll)(s); i <= (ll)(e); i ++)#define rep_(i, e, s) for(ll i = (ll)(e); i >= (ll)(s); i --)#define memset(a, b, c) memset(a, (int)b, c);#define size() size() * 1LL#define sc scanf#define pr printf#define sd(a) scanf("%lld", &a)#define ss(a) scanf("%s", a)#define inf 0x3f3f3f3f#define INF 0x3f3f3f3f3f3f3f3f#define esp 1e-7#define mod (ll)(1e9 + 7)
using namespace std;/*=========================ACMer===========================*/const ll mxn =2e5+10;
ll ar[mxn];
ll br[mxn];
ll cr[mxn];
vector<Pir> v;
ll sov(ll ar[], ll n){
ll t = ar[n], ans =0;rep_(i, n -1,1){if(ar[i]== t)continue;else{
ans +=abs(ar[i]- t);
t = ar[i];}}return ans;}intmain(){Run();
ll T;sd(T);while(T --){
v.clear();
ll n;sd(n);for_(i,1, n){sd(ar[i]);
br[i]= ar[i];}if(n ==1|| n ==2){pr("0\n");continue;}
ll ans = INF;//第一种修改最右边的元素
br[n]= br[n -1];
ans =min(ans,sov(br, n));
br[n]= ar[n];//修改最左边的情况
br[1]= br[2];
ans =min(ans,sov(br, n));
br[1]= ar[1];
ar[0]= ar[1];
ar[n +1]= ar[n];
Pir id =m_p(-INF,1);for_(i,2, n -1){if((ar[i]>= ar[i +1]&& ar[i]>= ar[i -1])||(ar[i]<= ar[i +1]&& ar[i]<= ar[i -1])){
cr[i]=abs(ar[i]- ar[i +1])+abs(ar[i]- ar[i -1])-abs(ar[i -1]- ar[i +1]);if(id.fi < cr[i]){
id.fi = cr[i];
id.se = i;}}}//修改中间的情况
br[id.se]= br[id.se +1];
ans =min(ans,sov(br, n));
br[id.se]= ar[id.se];pr("%lld\n", ans);}return0;}