码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 1588: [HNOI2002]营业额统计

时间:2017-01-01 22:50:42      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:mit   sigma   time   zoj   rip   status   --   limit   mem   

1588: [HNOI2002]营业额统计

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 14396  Solved: 5521
[Submit][Status][Discuss]

Description

营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。 ? 输入输出要求

Input

第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i天公司的营业额。

Output

输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。

Sample Input

6
5
1
2
5
4
6

Sample Output

12

HINT

 

结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12


该题数据bug已修复.----2016.5.15

 

Source

#include<cstdio>
#include<iostream>
using namespace std;
const int N=4e4+10;
int n,rt,size,fa[N],c[N][2],num[N];
int ans,tp,ts;
void rotate(int x,int &k){
    int y=fa[x],z=fa[y],l,r;
    l=(c[y][1]==x);r=l^1;
    if(k==y) k=x;
    else c[z][c[z][1]==y]=x;
    fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
    c[y][l]=c[x][r];c[x][r]=y;
}
void splay(int x,int &k){
    while(x!=k){
        int y=fa[x],z=fa[y];
        if(y!=k){
            if((c[y][0]==x)^(c[z][0]==y)) rotate(x,k);
            else rotate(y,k);
        }
        rotate(x,k);
    }
}
void insert(int x,int &k,int last){
    if(!k){
        k=++size;num[k]=x;fa[k]=last;splay(k,rt);return ;
    }
    x<num[k]?insert(x,c[k][0],k):insert(x,c[k][1],k);
}
void pred(int &k,int x){
    if(!k) return ;
    if(num[k]<=x){
        tp=num[k];
        pred(c[k][1],x);
    }
    else pred(c[k][0],x);
}
void succ(int &k,int x){
    if(!k) return ;
    if(num[k]>=x){
        ts=num[k];
        succ(c[k][0],x);
    }
    else succ(c[k][1],x);
}
int main(){
    scanf("%d",&n);
    for(int i=0,x;i<n;i++){
        scanf("%d",&x);
        if(!rt) ans+=x;
        else{
            tp=ts=-1;
            pred(rt,x);succ(rt,x);
            if(ts==-1) ans+=(x-tp);
            else if(tp==-1) ans+=(ts-x);
            else ans+=min((x-tp),(ts-x));
        }
        insert(x,rt,0);
    }
    printf("%d",ans);
    return 0;
}

 

BZOJ 1588: [HNOI2002]营业额统计

标签:mit   sigma   time   zoj   rip   status   --   limit   mem   

原文地址:http://www.cnblogs.com/shenben/p/6241611.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!