• bzoj1588: [HNOI2002]营业额统计


    1588: [HNOI2002]营业额统计

    Time Limit: 5 Sec  Memory Limit: 162 MB

    Description

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

    Input

    第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i
    天公司的营业额。
    天数n<=32767,
    每天的营业额ai <= 1,000,000。
    最后结果T<=2^31

    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

    Splay裸题;

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #define MAXN 200008
     6 using namespace std;
     7  
     8 const int inf=1e9;
     9 int n,m,num[MAXN],tree[MAXN][2],fa[MAXN],rt,size,tot,x,ans,t1,t2;
    10  
    11 void rotate(int x,int &k){
    12     int y=fa[x],z=fa[y],l,r;
    13     if(tree[y][0]==x) l=0; else l=1;
    14     r=l^1;
    15     if(y==k) k=x;
    16     else{
    17         if(tree[z][0]==y) tree[z][0]=x; else tree[z][1]=x;
    18     }
    19     fa[x]=z; fa[y]=x; fa[tree[x][r]]=y;
    20     tree[y][l]=tree[x][r]; tree[x][r]=y;
    21 }
    22  
    23 void splay(int x,int &k){
    24     int y,z;
    25     while(x!=k){
    26         y=fa[x],z=fa[y];
    27         if(y!=k){
    28             if((tree[y][0]==x)^(tree[z][0]==y)) rotate(x,k);
    29             else rotate(y,k);
    30         }
    31         rotate(x,k);
    32     }
    33 }
    34  
    35 void insert(int &k,int x,int last){
    36     if(k==0){
    37         size++;
    38         k=size;
    39         num[k]=x;
    40         fa[k]=last;
    41         splay(k,rt);
    42         return;
    43     }
    44     if(x>num[k]) insert(tree[k][1],x,k);
    45     else insert(tree[k][0],x,k);
    46 }
    47  
    48 void ask_after(int k,int x){
    49     if(k==0) return;
    50     if(num[k]>=x){
    51         t2=num[k];
    52         ask_after(tree[k][0],x);
    53     }
    54     else ask_after(tree[k][1],x);
    55 }
    56  
    57 void ask_before(int k,int x){
    58     if(k==0) return;
    59     if(num[k]<=x){
    60         t1=num[k];
    61         ask_before(tree[k][1],x);
    62     }
    63     else ask_before(tree[k][0],x);
    64 }
    65  
    66 int main(){
    67     scanf("%d",&n);
    68     ans=0;rt=0;
    69     for(int i=1;i<=n;i++){
    70         int x;
    71         scanf("%d",&x);
    72         t1=-inf; t2=inf;
    73         ask_before(rt,x);
    74         ask_after(rt,x);
    75         if(i!=1) ans+=min(x-t1,t2-x);
    76         else ans+=x;
    77         insert(rt,x,0);
    78     }
    79     printf("%d",ans);
    80 }
    81 
  • 相关阅读:
    Linux系统中的load average
    通过数据库评估存储设备IO性能-Oracle11gIO校准功能介绍
    ORACLE查询字段中含有空格的数据
    JavaScript&Typescript中的时间
    LeetCode
    LeetCode
    面试问题及知识汇总
    Bootstrap布局容器与栅格系统
    JVM垃圾回收(GC)
    9. 专题
  • 原文地址:https://www.cnblogs.com/WQHui/p/8576372.html
Copyright © 2020-2023  润新知