第一次写splay,还是写复杂一点吧,左旋右旋都写,不然过几天自己都看不懂了。。
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<functional>
typedef long long ll;
using namespace std;
//#pragma comment(linker, "/STACK:1024000000,1024000000")
const int N=500005;
int fa[N],c[N],ch[N][2],x,n,i,idn,ans,root;
void look(int i)
{
if (i==0) return;
look(ch[i][0]);
printf("%d ",c[i]);
look(ch[i][1]);
}
void zag(int x)
{
int y=fa[x],z=fa[y];
ch[y][1]=ch[x][0]; fa[ch[y][1]]=y;
ch[x][0]=y; fa[y]=x;
fa[x]=z;
if (z)
if (ch[z][0]==y) ch[z][0]=x;else ch[z][1]=x;
}
void zig(int x)
{
int y=fa[x],z=fa[y];
ch[y][0]=ch[x][1]; fa[ch[y][0]]=y;
ch[x][1]=y; fa[y]=x;
fa[x]=z;
if (z)
if (ch[z][0]==y) ch[z][0]=x;else ch[z][1]=x;
}
void splay(int x)
{
while(fa[x])
{
int y=fa[x],z=fa[y];
if (!z)
if (ch[y][0]==x) zig(x);else zag(x);
else
{
if (ch[z][0]==y)
if (ch[y][0]==x) zig(y),zig(x);
else zag(x),zig(x);
else
if (ch[y][0]==x) zig(x),zag(x);
else zag(y),zag(x);
}
}
root=x;
}
void ins(int x,int v)
{
int nxt;
if (v<c[x]) nxt=0;else nxt=1;
while(ch[x][nxt])
{
x=ch[x][nxt];
if (v<c[x]) nxt=0;else nxt=1;
}
idn++; ch[x][nxt]=idn; fa[idn]=x; c[idn]=v;
//look(1);
splay(idn);
//look(1);
}
int pre(int x)
{
int tmp=ch[x][0];
while(ch[tmp][1]) tmp=ch[tmp][1];
return c[tmp];
}
int suc(int x)
{
int tmp=ch[x][1];
while(ch[tmp][0]) tmp=ch[tmp][0];
return c[tmp];
}
int main()
{
scanf("%d",&n);
idn=1,c[1]=-2000000000; root=1;
ins(root,2000000000);
for (i=1;i<=n;i++)
{
if (scanf("%d",&x)==-1) x=0;
if (i==1) ans+=x,ins(root,x);
else ins(root,x),ans+=min(x-pre(root),suc(root)-x);
//look(root);printf("\n");
}
printf("%d",ans);
}