zoukankan      html  css  js  c++  java
  • BZOJ1588 [HNOI2002]营业额统计

    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

    题解


    splay裸题,求一下前驱和后继搞一下就可以了。

    此题在codevs上有一个点超时(不知道为什么),BZOJ上数据有问题,我也没有办法

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 using namespace std;
     5 const int maxn=40000; 
     6 int tr[maxn][2],fa[maxn],num[maxn],ans,n,x,t1,t2,size=0,rt;
     7 void rotate(int x,int &k){
     8     int y=fa[x],z=fa[y],l,r;
     9     if (tr[y][0]==x)l=0; else l=1; r=l^1;
    10     if (y==k) k=x;
    11     else {
    12         if (tr[z][0]==y) tr[z][0]=x;else tr[z][1]=x;
    13     }
    14     fa[x]=z;fa[y]=x;fa[tr[x][r]]=y;
    15     tr[y][l]=tr[x][r];tr[x][r]=y;
    16 }
    17 
    18 void splay(int x,int &k){
    19     int y,z;
    20     while (x!=k){
    21         y=fa[x],z=fa[y];
    22         if (y!=k){
    23             if ((tr[z][0]==y)^(tr[y][0]==x)) rotate(x,k);
    24             else rotate(y,k);
    25         }
    26         rotate(x,k);
    27     }
    28 }
    29 
    30 void insert(int x,int &k,int last){
    31     if (k==0){
    32         size++;k=size;num[k]=x;fa[k]=last;splay(k,rt);return;
    33     }
    34     if (x>=num[k]) insert(x,tr[k][1],k); else insert(x,tr[k][0],k);
    35 }
    36 
    37 void large(int &k,int x){
    38     if (k==0) return;
    39     if (num[k]>=x){
    40         t1=num[k];
    41         large(tr[k][0],x);
    42     }
    43     else large(tr[k][1],x);
    44 }
    45 
    46 void small(int &k,int x){
    47     if (k==0) return;
    48     if (num[k]<=x){
    49         t2=num[k];
    50         small(tr[k][1],x);
    51     }
    52     else small(tr[k][0],x);
    53 }
    54 
    55 int main(){
    56     scanf("%d",&n);
    57     for (int i=0;i<n;i++){
    58         if(scanf("%d",&x) == EOF) x = 0;//关于如何解决BZOJ上的错误
    59         if (!rt) {ans+=x;insert(x,rt,0);}
    60         else{
    61         t1=t2=-1;
    62         large(rt,x);small(rt,x);
    63         if (t1==-1) ans+=(x-t2);
    64         else if (t2==-1) ans+=(t1-x);
    65         else ans+=min((x-t2),(t1-x));
    66         insert(x,rt,0);
    67     }
    68     }
    69     printf("%d",ans);
    70 }
  • 相关阅读:
    【BZOJ 4631】4631: 踩气球 (线段树)
    【BZOJ 4148】 4148: [AMPPZ2014]Pillars (乱搞)
    【LYOI 212】「雅礼集训 2017 Day8」价(二分匹配+最大权闭合子图)
    【BZOJ 4104】 4104: [Thu Summer Camp 2015]解密运算 (智商)
    【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)
    【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)
    【BZOJ 3997】 3997: [TJOI2015]组合数学 (DP| 最小链覆盖=最大点独立集)
    【BZOJ 3727】 3727: PA2014 Final Zadanie (递推)
    【BZOJ 3442】 3442: 学习小组 (最大费用流)
    【BZOJ 3218】 3218: a + b Problem(最小割+可持久化线段树)
  • 原文地址:https://www.cnblogs.com/wuminyan/p/5122687.html
Copyright © 2011-2022 走看看