也是旧题重做,本次是splay,原来写的treap版本请移步:http://www.cnblogs.com/evan-oi/archive/2012/02/03/2337324.html
也是splay水题不多说了。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
#define MaxN 10010
#define INF 2000000
int n,tot=0,root=0,ans=0;
struct atp
{
int data,f,l,r,cnt;
}a[MaxN*8];
void Right(int x)
{
int y=a[x].f;
int z=a[y].f,c=a[x].r;
if (a[z].l==y) a[z].l=x; else a[z].r=x; a[x].f=z;
a[x].r=y;a[y].f=x;
a[y].l=c;a[c].f=y;
}
void Left(int x)
{
int y=a[x].f;
int z=a[y].f,c=a[x].l;
if (a[z].l==y) a[z].l=x; else a[z].r=x; a[x].f=z;
a[x].l=y;a[y].f=x;
a[y].r=c;a[c].f=y;
}
void splay(int &root,int x)
{
int y,z;
while (x!=root)
{
y=a[x].f;z=a[y].f;
if (y==root)
{
if (a[y].l==x) Right(x); else Left(x);
root=x;
} else
if (a[z].l==y)
if (a[y].l==x) Right(y),Right(x); else
Left(x),Right(x); else
if (a[y].r==x) Left(y),Left(x); else
Right(x),Left(x);
if (z==root) root=x;
}
}
void insert(int &t,int x,int f)
{
if (t==0)
{
tot++;
t=tot;
a[t].l=a[t].r=0;
a[t].f=f;
a[t].data=x;
a[t].cnt=1;
splay(root,t);
} else
if (x<a[t].data) insert(a[t].l,x,t); else
if(x>a[t].data) insert(a[t].r,x,t); else
if (x==a[t].data) a[t].cnt++,splay(root,t);
}
int Max(int t)
{
if (t==0) return INF;
if (a[t].r!=0) return Max(a[t].r); else
return a[t].data;
}
int Min(int t)
{
if (t==0) return INF;
if (a[t].l!=0) return Min(a[t].l); else
return a[t].data;
}
int main()
{
int x,t1,t2;
freopen("in","r",stdin);
//freopen("1.out","w",stdout);
scanf("%d",&n);
scanf("%d",&x);
ans=x;insert(root,x,0);
for (int i=2;i<=n;i++)
{
scanf("%d",&x);
insert(root,x,0);
if (a[root].cnt==1)
{
t1=Max(a[root].l);
t2=Min(a[root].r);
ans+=min(abs(x-t1),abs(x-t2));
}
}
printf("%d",ans);
return 0;
}