#include <cstdlib> #include <iostream> #include <queue> using namespace std; int n,a[500050],ans=0; struct node{ int num; int pri;//平衡树的权重 node *l=nullptr,*r=nullptr; node(int k){ num=k; pri=rand(); } }*root=nullptr;//NULL nullptr node* rightmove(node *p){ node *x=p->l; p->l=x->r; x->r=p; return x; } node* leftmove(node *p){ node *x=p->r; p->r=x->l; x->l=p; return x; } node* insert(node *p,int n){ if(p==nullptr) return new node(n); if(n<p->num){ p->l=insert(p->l,n); if(p->pri<p->l->pri) p=rightmove(p);//将左子变根 } else if(n>=p->num){ p->r=insert(p->r,n); if(p->pri<p->r->pri) p=leftmove(p);//将右子变根 } return p; } int findl(node *p,int n){ //求二叉搜索树中,比n小的最大的数字 int ans=-999999999; while(p){ if(p->num<=n) { ans=p->num; p=p->r; } else p=p->l; } return ans; } int findr(node *p,int n){ //求二叉搜索树中,比n大的最小的数字 int ans=999999999; while(p){ if(p->num>=n) { ans=p->num; p=p->l; } else p=p->r; } return ans; } void cx(node *p){ queue<node*> q; q.push(p); while(!q.empty()){ node *u=q.front(); cout<<u->num; q.pop(); if(u->l) q.push(u->l); if(u->r) q.push(u->r); } } int main(){ cin>>n; cin>>a[1]; root=insert(root,a[1]); for(int i=2;i<=n;i++){ cin>>a[i]; ans+=min(a[i]-findl(root,a[i]),findr(root,a[i])-a[i]); root=insert(root,a[i]); } cout<<ans+a[1]; return 0; } |