| 记录编号 | 175896 | 评测结果 | AAAAAAAAAA | 
    
        | 题目名称 | 1533.[HNOI 2002]营业额统计 | 最终得分 | 100 | 
    
        | 用户昵称 |  一個人的雨 | 是否通过 | 通过 | 
    
        | 代码语言 | C++ | 运行时间 | 0.409 s | 
    
        | 提交时间 | 2015-08-07 14:17:00 | 内存使用 | 0.28 MiB | 
    
    
    
    		显示代码纯文本
		
		#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<map>
#include<cmath>
using namespace std;
struct node{
    node *left,*right;
    int v,p,cnt,sz;
}*root,*null=new node((node){null,null,0,0,0,0});
int ans=0,n;
map<int,int>mp;
void push_up(node *x){
    x->sz=x->left->sz+x->right->sz+x->cnt;
}
void lturn(node *&x){
    node *y=x->right;
    x->right=y->left; y->left=x;
    y->sz=x->sz; push_up(x); x=y;
}
void rturn(node *&x){
    node *y=x->left;
    x->left=y->right; y->right=x;
    y->sz=x->sz; push_up(x); x=y;
}
void Insert(node *&x,int k){
    if (!x->sz){
        x=new node;
        x->left=x->right=null;
        x->v=k; x->p=rand();
        x->sz=x->cnt=1;
        return;
    }
    x->sz++;
    if (k==x->v) x->cnt++;
    else if (k>x->v){
        Insert(x->right,k);
        if (x->right->p<x->p) lturn(x);
    }
    else {
        Insert(x->left,k);
        if (x->left->p<x->p) rturn(x);
    }
}
int Q_rank(node *x,int k){
    if (!x->sz) return 0;
    if (k==x->v) return x->left->sz+1;
    else if (k<x->v) return Q_rank(x->left,k);
    else return Q_rank(x->right,k)+x->left->sz+x->cnt;
}
int Q_num(node *x,int k){
    if (!x->sz) return 0;
    if (k<=x->left->sz) return Q_num(x->left,k);
    else if (k>x->left->sz+x->cnt)
        return Q_num(x->right,k-x->left->sz-x->cnt);
    else return x->v;
}
int Q_pro(node *x,int k,int c){
    if (!x->sz) return c;
    if (k>x->v) return Q_pro(x->right,k,x->v);
    else return Q_pro(x->left,k,c);
}
int Q_suc(node *x,int k,int c){
    if (!x->sz) return c;
    if (k<x->v) return Q_suc(x->left,k,x->v);
    else return Q_suc(x->right,k,c);
}
int main()
{
	freopen("turnover.in","r",stdin);
	freopen("turnover.out","w",stdout);
	scanf("%d",&n); root=null; int num1,num2;
	for (int i=1;i<=n;++i){
		int x; num1=num2=0x7fffffff/2;
		if(scanf("%d",&x)==EOF)x=0;
		Insert(root,x);
		if (i==1) {ans+=x; mp[x]=1;}
		else {
			if (mp[x]) continue;
			int k=Q_rank(root,x);
			if (k>1) num1=Q_num(root,k-1);
			if (k<i) num2=Q_num(root,k+1);
			ans+=min(abs(num1-x),abs(num2-x));
			mp[x]=1;
		}
		
	}
	printf("%d",ans); //system("pause");
	return 0;
}