宠物收养所简化版,treap有些细节不要写错。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<ctime>
#define maxn 100005
using namespace std;
long long ls[maxn],rs[maxn],value[maxn],fix[maxn],root=0;
long long ans=0,n,now,tot=0,l=-1,r=-1;
void lturn(long long &k)
{
long long t=rs[k];rs[k]=ls[t];
ls[t]=k;k=t;
}
void rturn(long long &k)
{
long long t=ls[k];ls[k]=rs[t];
rs[t]=k;k=t;
}
void insert(long long &k,long long x)
{
if (k==0)
{
k=++tot;
value[tot]=x;
ls[tot]=0;rs[tot]=0;
fix[tot]=rand();
return;
}
else
{
if (x>value[k])
{
insert(rs[k],x);
if (fix[rs[k]]<fix[k])
lturn(k);
}
else
{
insert(ls[k],x);
if (fix[ls[k]]<fix[k])
rturn(k);
}
}
}
void pre(long long k,long long x)
{
if (k==0) return;
if (x>=value[k])
{
l=value[k];
pre(rs[k],x);
}
else pre(ls[k],x);
}
void sub(long long k,long long x)
{
if (k==0) return;
if (x<=value[k])
{
r=value[k];
sub(ls[k],x);
}
else sub(rs[k],x);
}
void work()
{
scanf("%lld",&now);
pre(root,now);
sub(root,now);
if (l==-1) {ans=ans+abs(r-now);insert(root,now);return;}
if (r==-1) {ans=ans+abs(l-now);insert(root,now);return;}
l=abs(l-now);r=abs(r-now);
ans=ans+min(l,r);
l=-1;r=-1;
insert(root,now);
}
int main()
{
srand(time(0));
scanf("%lld",&n);
scanf("%lld",&now);
ans=now;
insert(root,now);
for (long long k=2;k<=n;k++)
work();
printf("%lld
",ans);
return 0;
}