Treap学的hzwer的模版,感觉还是比较轻松愉快的
/**************************************************************
Problem: 1588
User: Clare
Language: C++
Result: Accepted
Time:196 ms
Memory:2840 kb
****************************************************************/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
#define N 100010
#define INF 1000000000
int n,tot,root,ans1,ans2;
long long Ans;
int l[N],r[N],rd[N],v[N];
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void R_rotate(int &k)
{
int tmp=l[k];
l[k]=r[tmp];r[tmp]=k;k=tmp;
}
void L_rotate(int &k)
{
int tmp=r[k];
r[k]=l[tmp];l[tmp]=k;k=tmp;
}
void Insert(int &k,int x)
{
if(k==0)
{
k=++tot;v[k]=x;rd[k]=rand();
return;
}
if(v[k]>x)
{
Insert(l[k],x);
if(rd[l[k]]<rd[k])R_rotate(k);
}
else
{
Insert(r[k],x);
if(rd[r[k]]<rd[k])L_rotate(k);
}
}
void Get_before(int k,int x)
{
if(k==0)
return;
if(v[k]<=x)
{
ans1=v[k];Get_before(r[k],x);
}
else Get_before(l[k],x);
}
void Get_after(int k,int x)
{
if(k==0)
return;
if(v[k]>=x)
{
ans2=v[k];Get_after(l[k],x);
}
else Get_after(r[k],x);
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
int x;
if(scanf("%d",&x)==EOF)
x=0;
if(i==1)
{
Ans+=abs(x);Insert(root,x);
continue;
}
ans1=-INF;ans2=INF;
Get_after(root,x);Get_before(root,x);
Ans+=min(x-ans1,ans2-x);
Insert(root,x);
}
cout<<Ans<<endl;
return 0;
}