要求O(logN)插入或查找前驱后继,手搓平衡树或者STL自带的红黑树(map,set)都能做
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<unordered_map>
#include<cstdlib>
using namespace std;
typedef long long LL;
const int N=2010,MOD=998244353,INF=0x7f7f7f7f;
// unordered_map<int,int>mp;
map<int,int>mp;
void solve(){
int n;
cin>>n;
int x;
cin>>x;
int res=x;
mp[INF]=mp[-INF]=1;
mp[x]=1;
while(--n){
cin>>x;
map<int,int>::iterator it=mp.find(x);
if(it!=mp.end()){
res+=0;
mp[x]++;
}else{
mp[x]=1;
it=mp.find(x);
map<int,int>::iterator l=it,r=it;
if(it!=mp.begin()) l--;
if(it!=mp.end()) r++;
res+=min(abs(x-l->first),abs(x-r->first) );
// cout<<abs(x-l->first)<<' '<<abs(x-r->first) <<endl;
}
}
cout<<res<<endl;
}
int main(){
ios::sync_with_stdio(false),cin.tie(0);
int t;
// cin>>t;
t=1;
while(t--) solve();
return 0;
}