zoukankan      html  css  js  c++  java
  • BZOJ1588(HNOI2002)营业额统计

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1588

    1588: [HNOI2002]营业额统计

    Time Limit: 5 Sec  Memory Limit: 162 MB

    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

    卧槽。。这题WA了无数次。。

    首先,这题数据有问题,读入的时候要scanf("%d",&val)!=EOF,因为数据有丢失。

    第二,就没有第二了,某个数的前驱在这里要特判一下是否是本身。。又是一道裸splayT_T。。。

    Codes:

     1 #include<set>
     2 #include<map>
     3 #include<queue>
     4 #include<cmath>
     5 #include<cstdio>
     6 #include<cstdlib>
     7 #include<cstring>
     8 #include<iostream>
     9 #include<algorithm>
    10 using namespace std;
    11 const int N = 50010;
    12 const int maxint = 214748364;
    13 #define fa(i) (T[i].p)
    14 #define Ch1 (T[i].s[0])
    15 #define Ch2 (T[i].s[1])
    16 #define Loc(i) (T[fa(i)].s[1]==i)
    17 #define Sets(a,b,c){T[a].s[c] = b; fa(b) = a;}
    18 #define For(i,n) for(int i=1;i<=n;i++)
    19 #define Rep(i,l,r) for(int i=l;i<=r;i++)
    20 #define Down(i,r,l) for(int i=r;i>=l;i--)
    21 
    22 struct tnode{
    23     int s[2],num,v,p;
    24 }T[N];
    25 
    26 int n,val,root,tot,ans;
    27 
    28 void Rot(int x){
    29     int y = fa(x) , z = fa(y);
    30     int lx = Loc(x) , ly = Loc(y);
    31     Sets(y,T[x].s[!lx],lx);
    32     Sets(z,x,ly);
    33     Sets(x,y,!lx);
    34 }
    35 
    36 void Splay(int i,int goal){
    37     while(fa(i)!=goal){
    38         if(fa(fa(i))!=goal) Rot(fa(i));
    39         Rot(i);
    40     }
    41     if(!goal) root = i;
    42 }
    43 
    44 void Insert(int V,int i){
    45     if(!i){
    46         root = ++tot;
    47         T[tot].v = V;T[tot].p = 0;T[tot].num = 1;
    48         return;
    49     }
    50     if(T[i].v==V){
    51         T[i].num++;
    52         Splay(i,0);
    53     }
    54     else {
    55         if(!T[i].s[V>T[i].v]){
    56             T[i].s[V>T[i].v] = ++tot;
    57             T[tot].p = i;T[tot].v = V;T[tot].num = 1;
    58             Splay(tot,0);
    59         }
    60         else Insert(V,T[i].s[V>T[i].v]);
    61     }
    62 }
    63 
    64 int pred(int i){
    65     int Next = T[i].s[0];
    66     if(T[i].num>1) return T[i].v;
    67     if(!Next) return maxint;
    68     while(T[Next].s[1]) Next = T[Next].s[1];
    69     return T[Next].v;
    70 }
    71 
    72 int succ(int i){
    73     int Next = T[i].s[1];
    74     if(T[i].num>1)  return T[i].v;
    75     if(!Next)       return maxint;
    76     while(T[Next].s[0]) Next = T[Next].s[0];
    77     return T[Next].v;
    78 }
    79 
    80 int main(){
    81     scanf("%d",&n);
    82     For(i,n){
    83         if(scanf("%d",&val)==EOF) val = 0;
    84         Insert(val,root);
    85         int Pred = pred(root) , Succ = succ(root);
    86         if(Pred==maxint&&Succ==maxint) Pred = val;
    87         if(i!=1) ans+=min(abs(Pred-val),abs(Succ-val));
    88         else     ans+=val;
    89     }
    90     printf("%d
    ",ans);
    91     return 0;
    92 }

    显然这题可以用set直接写。。

  • 相关阅读:
    SCOI2007 组队
    ZJOI2008 生日聚会
    织梦标签截取指定数目字符
    HTML特殊符号对照表
    DedeCMS让{dede:list}标签支持weight权重排序
    PHP 5.4 中经 htmlspecialchars 转义后的中文字符串为空,DeDeCMS在PHP5.4下编辑器中文不显示问题
    把图文内容载入微应用中
    织梦安装错误
    dedecms创建或修改目录失败
    安装phpmyadmin
  • 原文地址:https://www.cnblogs.com/zjdx1998/p/3858899.html
Copyright © 2011-2022 走看看