BZOJ 1588 TREAP 解题报告

1588: [HNOI2002]营业额统计

Description

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

Input

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

Output

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

【解题报告】
实质:给定一个序列{ai},求:
这里写图片描述

关于这个随机函数

inline int q_rand()
{
    static int seed=10007; 
    return seed=int(seed*48271LL%2147483647);
}

十分的清真,至于为什么

http://blog.csdn.net/h348592532/article/details/52837228

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

inline int q_rand()
{
    static int seed=10007; 
    return seed=int(seed*48271LL%2147483647);
}

struct Node 
{
    Node *ch[2];
    int v,r;
    Node():r(q_rand()) {ch[0]=ch[1]=NULL;}
    Node(int v):v(v),r(q_rand()) {ch[0]=ch[1]=NULL;}
    int cmp(int va) 
    {
        return va<this->v?0:1;
    }
};
inline void Rotate(Node* &o,int d) 
{
    Node *k=o->ch[d^1];
    o->ch[d^1]=k->ch[d];
    k->ch[d]=o;
    o=k;
}
#define inf 0x7fffffff
inline int Insert(Node* &o,int v) 
{
    int t1=abs(v-o->v),t2=inf;
    int d=o->cmp(v);
    if(o->ch[d]==NULL) 
    {
        o->ch[d]=new Node(v);
    } 
    else 
    {
        t2=Insert(o->ch[d],v);
    }
    if(o->r<o->ch[d]->r) Rotate(o,d^1);
    return min(t1,t2);
}

Node *root;

int N;

int main() 
{
    scanf("%d",&N);
    int ans=0,temp;
    //1st
    if(!~scanf("%d",&temp)) temp=0;
    ans=temp;
    root=new Node(temp);
    //else
    for(int i=1;i<N;++i) 
    {
        if(!~scanf("%d",&temp)) temp=0;
        ans+=Insert(root, temp);
    }
    printf("%d\n", ans);
    return 0;
}

让我看到你们的双手

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值