记录编号 175896 评测结果 AAAAAAAAAA
题目名称 [HNOI 2002]营业额统计 最终得分 100
用户昵称 Gravatar一個人的雨 是否通过 通过
代码语言 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;
}