RT 感谢
acwing上AC了 但洛谷RE了 不知道为啥
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define rd read()
#define inf 0x3f
#define INF 0x3f3f3f3f3f3f3f3f
#define mst(a,b) memset((a),(b),sizeof((a)))
#define Elaina 0
inline int read(){
int x=0,f=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x*f;
}
const int N=2e7+100;
struct Slpay{
int rt;
int tot;
int fa[N];
int ch[N][2];
int val[N];
int cnt[N];
int sz[N];
void maintain(int x){
sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+cnt[x];
}
bool get(int x){
return x==ch[fa[x]][1];
}
void clear(int x){
ch[x][0]=ch[x][1]=fa[x]=val[x]=sz[x]=cnt[x]=0;
}
void rotate(int x){
int y=fa[x],z=fa[y],chk=get(x);
ch[y][chk]=ch[x][chk^1];
if(ch[x][chk^1]) fa[ch[x][chk^1]]=y;
ch[x][chk^1]=y;
fa[y]=x;
fa[x]=z;
if(z) ch[z][y==ch[z][1]]=x;
maintain(y);
maintain(x);
}
void splay(int x,int goal=0){
if(goal==0) rt=x;
while(fa[x]!=goal){
int f=fa[x];
if(fa[fa[x]]!=goal){
rotate(get(x)==get(f)?f:x);
}
rotate(x);
}
}
void ins(int k){//insert
if(!rt){
val[++tot]=k;
cnt[tot]++;
rt=tot;
maintain(rt);
return;
}
int cur=rt,f=0;
while(1){
if(val[cur]==k){
cnt[cur]++;
maintain(cur);
maintain(f);
splay(cur);
break;
}
f=cur;
cur=ch[cur][val[cur]<k];
if(!cur){
val[++tot]=k;
cnt[tot]++;
fa[tot]=f;
ch[f][val[f]<k]=tot;
maintain(tot);
maintain(f);
splay(tot);
break;
}
}
}
int rk(int k){//the rank of "k"
int res=0,cur=rt;
while(1){
if(k<val[cur]){
cur=ch[cur][0];
}else{
res+=sz[ch[cur][0]];
if(!cur) return res+1;
if(k==val[cur]){
splay(cur);
return res+1;
}
res+=cnt[cur];
cur=ch[cur][1];
}
}
}
int kth(int k){//the number whose rank is "k"
int cur=rt;
while(1){
if(ch[cur][0] && k<=sz[ch[cur][0]]){
cur=ch[cur][0];
}else{
k-=cnt[cur]+sz[ch[cur][0]];
if(k<=0){
splay(cur);
return val[cur];
}
cur=ch[cur][1];
}
}
}
void find(int x){
int cur=rt;
if(!cur) return;
while(ch[cur][x>val[cur]]&&x!=val[cur]){
cur=ch[cur][x>val[cur]];
}
splay(cur,0);
}
int get_pre(int x){
find(x);
int cur=rt;
if(val[cur]<x) return cur;
cur=ch[cur][0];
while(ch[cur][1]){
cur=ch[cur][1];
}
return cur;
}
int get_nxt(int x){
find(x);
int cur=rt;
if(val[cur]>x) return cur;
cur=ch[cur][1];
while(ch[cur][0]){
cur=ch[cur][0];
}
return cur;
}
}tr;
int n,ans=0;
bool vis[N];
signed main(){
tr.ins(INF),tr.ins(-INF);
n=rd;
ans=rd;
tr.ins(ans);
vis[ans]=1;
for(int i=2;i<=n;i++){
int x=rd;
if(vis[x])continue;
vis[x]=1;
ans+=min(abs(x-tr.val[tr.get_pre(x)]),abs(tr.val[tr.get_nxt(x)]-x));
tr.ins(x);
}
printf("%lld",ans);
return Elaina;
}