平衡树的题目,原本应该构建一个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; }