平衡树的题目,原本应该构建一个treap,但是看题解似乎set自带的属性也能过,于是赶紧学了一手,实在是太香了...

注意事项
1.set中lower_bound返回的是指针
2.为了防止lower_bound返回指针是set.end()–>即寻找不到,应当预处理一下,在set当中预先加入+-INF方便处理

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int s=0,w=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
            w=-w;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        s=s*10+c-'0';
        c=getchar();
    }
    return s*w;
}
const int N=40000+5;
int n,ans;
set<int> s;
int main()
{
    n=read();
    s.insert(1e9);
    s.insert(-(1e9));
    ans=0;
    for(int i=1;i<=n;i++)
    {
        int x=read();
        set<int>:: iterator it=s.lower_bound(x);
        if(i!=1)
            ans+=min(abs(x-*(--it)),abs(x-*it));
        else
            ans+=abs(x);
        s.insert(x);
    }
    printf("%d\n",ans);
    return 0;
}