zoukankan      html  css  js  c++  java
  • bzoj 1588: [HNOI2002]营业额统计 treap

    1588: [HNOI2002]营业额统计

    Time Limit: 5 Sec  Memory Limit: 162 MB
    Submit: 13902  Solved: 5225
    [Submit][Status][Discuss]

    Description

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

    Input

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

    Output

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

    Sample Input

    6
    5
    1
    2
    5
    4
    6

    Sample Output

    12
    思路:裸的treap,找前驱后继;
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define pi (4*atan(1.0))
    #define eps 1e-14
    const int N=2e5+10,M=4e6+10,inf=1e9+10,mod=1e9+7;
    const ll INF=1e18+10;
    struct is
    {
        int l,r,v,si,rnd,w;//v 权值  rnd 堆的优先级   w为v的个数
    } tree[N];
    int n,sz,root,ans,ans1;
    void update(int pos)
    {
        tree[pos].si=tree[tree[pos].l].si+tree[tree[pos].r].si+tree[pos].w;
    }
    void lturn(int &pos)
    {
        int t=tree[pos].r;
        tree[pos].r=tree[t].l;
        tree[t].l=pos;
        tree[t].si=tree[pos].si;
        update(pos);
        pos=t;
    }
    void rturn(int &pos)
    {
        int t=tree[pos].l;
        tree[pos].l=tree[t].r;
        tree[t].r=pos;
        tree[t].si=tree[pos].si;
        update(pos);
        pos=t;
    }
    void pushin(int &k,int x)
    {
        if(k==0)
        {
            sz++;
            k=sz;
            tree[k].w=tree[k].si=1;
            tree[k].rnd=rand();
            tree[k].v=x;
            return;
        }
        tree[k].si++;
        if(tree[k].v==x)tree[k].w++;
        else if(tree[k].v>x)
        {
            pushin(tree[k].l,x);
            if(tree[tree[k].l].rnd>tree[k].rnd)
                rturn(k);
        }
        else
        {
            pushin(tree[k].r,x);
            if(tree[tree[k].r].rnd>tree[k].rnd)
                lturn(k);
        }
    }
    void query(int pos,int x)
    {
        if(pos==0)return;
        if(tree[pos].v<=x)
        {
            ans=tree[pos].v;
            query(tree[pos].r,x);
        }
        else query(tree[pos].l,x);
    }
    void query1(int pos,int x)
    {
        if(pos==0)return;
        if(tree[pos].v>x)
        {
            ans1=tree[pos].v;
            query1(tree[pos].l,x);
        }
        else
            query1(tree[pos].r,x);
    }
    int a[N];
    int main()
    {
        while(~scanf("%d",&n))
        {
            sz=root=0;
            memset(tree,0,sizeof(tree));
            for(int i=1; i<=n; i++)
            scanf("%d",&a[i]);
            int sum=a[1];
            pushin(root,a[1]);
            for(int i=2;i<=n;i++)
            {
                ans1=2*inf;
                ans=2*inf;
                query(root,a[i]);
                query1(root,a[i]);
                    if(ans1==2*inf)
                    sum+=abs(a[i]-ans);
                else if(ans==2*inf)
                    sum+=abs(a[i]-ans1);
                else
                    sum+=min(abs(a[i]-ans1),abs(a[i]-ans));
                pushin(root,a[i]);
            }
            printf("%d
    ",sum);
        }
    
        return 0;
    }
  • 相关阅读:
    android开发中的数据库SQLite的使用
    线程间的同步和通信机制
    关于垃圾回收
    进程间通信
    Thread和Runnable
    关于软件项目管理的感想~~~~~
    关于集成测试&&同行评审
    Junit and Maven Test
    window git
    use case
  • 原文地址:https://www.cnblogs.com/jhz033/p/5989815.html
Copyright © 2011-2022 走看看