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,找前驱后继;

   ps:set+二分过不了;

#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\n",sum);
    }

    return 0;
}
时间: 2024-11-08 21:47:20

bzoj 1588: [HNOI2002]营业额统计 treap的相关文章

BZOJ 1588: [HNOI2002]营业额统计 双向链表

BZOJ 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 9619  Solved: 3287 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1588 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来

BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap

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

BZOJ 1588: [HNOI2002]营业额统计

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14396  Solved: 5521[Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其

BZOJ 1588([HNOI2002]营业额统计-set)

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 10371  Solved: 3597 [Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者

BZOJ 1588 HNOI2002 营业额统计 裸Treap

题目大意:...题目描述不全看这里好了 给定一个序列 对于每个元素我们定义该数的最小波动值为这个数与前面所有数的差中的最小值(第一个数的最小波动值为第一个数本身) 求最小波动值之和 找最近的数只需要找前驱和后继就行了 平衡树的基本操作 不多说了 然后-- 此题多组数据!!尼玛!!看题目描述这也是单组数据啊!!什么**情况?? 而且多组数据尼玛也就算了!!输入数据还不全!!如果读到EOF需要按照0处理!尼玛这上哪里想去啊! 于是此题不看题解无法AC 鉴定完毕 60%达成 还剩四道题 水水吧...

bzoj 1588 [HNOI2002] 营业额统计 链表和Splay

来自HNOI 2002营业额的统计一题,这题以前是用链表水过的,最近看见许多splay的题,赶紧张一下知识. 题目大意就是对于一个序列,输出每个元素与它之前元素的差的最小值的和.先说链表的方法吧. 大概就是sort一下,记录每个点的rank.然后链表一下,很好理解,复杂度nlogn,瓶颈在于排序. #include<cstdio> #include<algorithm> #include<iostream> using namespace std; struct nod

[BZOJ 1588][HNOI2002]营业额统计(Splay)

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

洛谷 2234 BZOJ 1588 HNOI2002 营业额统计

[题解] treap模板题,直接用Treap维护前驱.后继,每次找到更接近当前val的加上就好了. 1 #include<cstdio> 2 #include<algorithm> 3 #define ls (a[u].l) 4 #define rs (a[u].r) 5 #define LL long long 6 using namespace std; 7 const int maxn=200010; 8 int n,k,x,y,z,v,tot,root; 9 struct

BZOJ 题目1588: [HNOI2002]营业额统计(Splay Tree 求前驱后继)

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 10828  Solved: 3771 [Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者