解题思路
按大小顺序建链表,然后按从后向前的顺序依次删除每个元素并统计答案。
稳稳水过,需要一些奇技淫巧。
代码:
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<cstdlib>
using namespace std;
int a[40005],xi[40005],sh[40005];
int s[40005],wi[40005],di[40005];
int n,ans,inf=2147483640;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&s[i]);
a[i]=s[i];
}
sort(a+1,a+n+1);
int top=unique(a+1,a+n+1)-a-1;
for(int i=1;i<=n;i++) {
wi[i]=lower_bound(a+1,a+top+1,s[i])-a;
di[wi[i]]++;
}
xi[0]=1;sh[top+1]=top;
for(int i=1;i<=top;i++){
sh[i]=i-1;
xi[i]=i+1;
}
for(int i=n;i>=2;i--){
int rc=inf,w=wi[i];
if(di[w]>1) rc=0;
else{
if(sh[w]!=0) rc=min(rc,abs(a[w]-a[sh[w]]));
if(xi[w]!=top+1) rc=min(rc,abs(a[w]-a[xi[w]]));
}
ans+=rc;di[w]--;
if(!di[w]) {xi[sh[w]]=xi[w];sh[xi[w]]=sh[w];}
}
printf("%d",ans+s[1]);
return 0;
}