处理出每个位置左边的最大值和右边的最大值。然后就可以o(1)计算去掉某位置的最大值了。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0),eps=1e-8; void File() { freopen("D:\\in.txt","r",stdin); freopen("D:\\out.txt","w",stdout); } inline int read() { char c = getchar(); while(!isdigit(c)) c = getchar(); int x = 0; while(isdigit(c)) { x = x * 10 + c - ‘0‘; c = getchar(); } return x; } const int maxn=100000+10; int T,n,a[maxn],L[maxn],R[maxn]; LL ans; int main() { scanf("%d",&T); while(T--) { ans=0; memset(L,0,sizeof L); memset(R,0,sizeof R); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=2;i<=n;i++) L[i]=max(L[i-1],abs(a[i]-a[i-1])); for(int i=n-1;i>=1;i--) R[i]=max(R[i+1],abs(a[i]-a[i+1])); for(int i=1;i<=n;i++) { if(i==1) ans=ans+R[2]; else if(i==n) ans=ans+L[n-1]; else ans=ans+max(L[i-1],max(R[i+1],abs(a[i-1]-a[i+1]))); } printf("%lld\n",ans); } return 0; }
时间: 2024-10-25 00:28:16