zoukankan      html  css  js  c++  java
  • 洛谷P2234 [HNOI2002]营业额统计(01Tire树)

    题目描述

    Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。

    Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:

    当最小波动值越大时,就说明营业情况越不稳定。

    而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。

    第一天的最小波动值为第一天的营业额。

    该天的最小波动值=min{|该天以前某一天的营业额-该天营业额|}。

    输入输出格式

    输入格式:

    输入由文件’turnover.in’读入。

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

    输出格式:

    输入输出样例

    输入样例#1: 复制
    6
    5
    1
    2
    5
    4
    6
    
    输出样例#1: 复制
    12

    说明

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

    来一发01Trie树

    表示懒得写查找前驱和后继的函数了,

    就用kth(查找排名为x的数)和rak(查找x的排名)偷了个懒

    找前驱的时候就是kth( rak(x) )

    后继是kth( rak(x) +1) (注意这里的前驱后继不是严格的,所以允许重复)

    时间复杂度可能有点高,不过还是能水过去的

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cmath>
     4 #include<iostream>
     5 #include<cstdlib>
     6 #include<cstring>
     7 using namespace std;
     8 const int MAXN=1e6+10,INF=1e7;
     9 inline char nc()
    10 {
    11     static char buf[MAXN],*p1=buf,*p2=buf;
    12     return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1++;
    13 }
    14 inline int read()
    15 {
    16     char c=nc();int x=0,f=1;
    17     while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}
    18     while(c>='0'&&c<='9'){x=x*10+c-'0';c=nc();}
    19     return x*f;
    20 }
    21 int ch[MAXN][2],num[MAXN],tot=2,root=1;
    22 inline void insert(int x)
    23 {
    24     x+=INF;
    25     for(int i=31,now=root,t; ~i; i--)
    26     {
    27         if( !(ch[now][ t=x>>i &1 ]) )    ch[now][t]=++tot;
    28         num[ now=ch[now][t] ]+=1;
    29     }
    30 }
    31 inline int rak(int x)
    32 {
    33     x+=INF;
    34     int ans=0;
    35     for(int i=31,now=root,t; ~i ; i--)
    36     {
    37         if( (t=x>>i &1) )    
    38             ans+=num[ ch[now][0] ];
    39         now=ch[now][t];
    40     }
    41     return ans;
    42 }
    43 inline int kth(int x)
    44 {
    45     int ans=0;
    46     for(int i=31,now=root; ~i ; i--)
    47     {
    48         if( x>num[ ch[now][0] ] )    ans|=1<<i,x-=num[ ch[now][0] ],now=ch[now][1];
    49         else now=ch[now][0];
    50     }
    51     return ans-INF;
    52 }
    53 int main()
    54 {
    55     #ifdef WIN32
    56     freopen("a.in","r",stdin);
    57     #else
    58     #endif
    59     int n=read(),ans=read();n=n-1;
    60     insert(ans);
    61     while(n--)
    62     {
    63         int x=read();
    64         int pre=kth( rak(x) );
    65         int lat=kth( rak(x) +1);
    66         ans+=min( abs(pre-x) ,abs(lat-x) );
    67         insert(x);
    68     }
    69     printf("%d",ans);
    70 }
  • 相关阅读:
    java.lang.NoClassDefFoundError: org/apache/poi/ss/formula/udf/UDFFinder
    IntelliJ使用指南—— 深入了解IntelliJ的Web部署逻辑
    javascript深入理解js闭包
    git commit -F时用到的commit.log模板
    github上需要生成密钥对:ssh key
    windows和linux字体库位置
    .vimrc配置文件
    iw交叉编译
    libnl和libopenssl,hostapd交叉编译
    linux中断
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7953476.html
Copyright © 2011-2022 走看看