splay模板题 注意一下没有前驱和后驱的情况
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
int rt, cnt, sz;
int ch[40005][2];
int cn[40005];
int fa[40005];
int val[40005];
void clear(int x)
{
ch[x][1] = ch[x][0] = cn[x] = fa[x] = val[x] = 0;
}
bool ws(int x)
{
return ch[fa[x]][1] == x;
}
void setfa(int s, int f, int d)
{
if(s != 0) fa[s] = f;
if(f != 0) ch[f][d] = s;
}
void rot(int x)
{
int f = fa[x]; int ff = fa[f]; int d1 = ws(x); int d2 = ws(f);
int p = ch[x][d1 ^ 1];
setfa(x, ff, d2);
setfa(f, x, d1 ^ 1);
setfa(p, f, d1);
}
void splay(int x)
{
for(; fa[x]; rot(x))
if(fa[fa[x]] && ws(x) == ws(fa[x])) rot(x);
rt = x;
}
void inser(int v)
{
if(rt == 0)
{
cnt++;
val[cnt] = v; ch[cnt][0] = ch[cnt][1] = fa[cnt] = 0;
cn[cnt] = 1;
rt = cnt;
return;
}
int now = rt, f = 0;
while(1)
{
if(val[now] == v)
{
cn[now]++;
splay(now);
return;
}
f = now;
now = ch[now][val[now] < v];
if(now == 0)
{
cnt++;
cn[cnt] = 1;
val[cnt] = v;
fa[cnt] = f;
ch[f][val[f] < v] = cnt;
ch[cnt][1] = ch[cnt][0] = 0;
splay(cnt);
break;
}
}
}
int pre()
{
int now = ch[rt][0];
while(ch[now][1]) now = ch[now][1];
return now;
}
int nex()
{
int now = ch[rt][1];
while(ch[now][0]) now = ch[now][0];
return now;
}
int main()
{
rt = cnt = 0;
val[0] = 10000000;
int ans = 0;
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
int x;
scanf("%d", &x);
if(i == 1)
{
ans += x;
inser(x);
}
else
{
inser(x);
if(cn[rt] > 1)
{
cn[rt]--;
continue;
}
ans += min(abs(val[pre()] - x), abs(val[nex()] - x));
}
}
printf("%d\n", ans);
return 0;
}