Description

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

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

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

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

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

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

Input&Output

Input

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

Output

  • 输出一个正整数,每天最小波动值之和,保证答案小于2^31.

Sample

Input

6
5
1
2
5
4
6

Output

12

Solution

找差的绝对值的最小值,可以维护一颗Treap,找当前输入数据的前驱和后缀,取差的绝对值的较小值,加入答案即可。需要注意的是,前驱和后缀的边界条件含等于,因为波动值可以为0。最后我们将当前数据插入Treap即可。本题不需要删除,代码量相对少了一点然而对其他dalao来说并不成问题

代码如下:

#define _CRT_SECURE_NO_WARNINGS //忽略掉VS的辣鸡设定
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define maxn 32770
#define INF 214700000
using namespace std;
struct node {
    int v, w;
    int l, r;
    int size, k;
    node() {
        l = r = 0;size = k = 0;
    }
}t[maxn];
int rt, cnt, ans, pos, k, n;
void New(int &p, int x)
{
    p = ++cnt;
    t[p].v = x;
    t[p].w = rand();
    t[p].size = t[p].k = 1;
}
void pushup(int p)
{
    t[p].size = t[t[p].l].size + t[t[p].r].size + t[p].k;
}
void turnl(int &p)
{
    int q = t[p].r;
    t[p].r = t[q].l;t[q].l = p;
    p = q;
    pushup(t[p].l);
    pushup(p);
}
void turnr(int &p)
{
    int q = t[p].l;
    t[p].l = t[q].r;t[q].r = p;
    p = q;
    pushup(t[p].r);
    pushup(p);
}
void Insert(int &p, int x)
{
    if (p == 0)
    {
        New(p, x);
        return;
    }
    t[p].size++;
    if (t[p].v == x)
        t[p].k++;
    else if (t[p].v<x) {
        Insert(t[p].r, x);
        if (t[t[p].r].w<t[p].w)turnl(p);
    }
    else {
        Insert(t[p].l, x);
        if (t[t[p].l].w<t[p].w)turnr(p);
    }
}
void pre(int p, int x)
{
    if (p == 0)return;
    else if (x>=t[p].v) {
        pos = p;
        pre(t[p].r, x);
    }
    else pre(t[p].l, x);
}
void suf(int p, int x)
{
    if (p == 0)return;
    else if (x<=t[p].v) {
        pos = p;
        suf(t[p].l, x);
    }
    else suf(t[p].r, x);
}
int main()
{
    int c;
    srand(time(NULL));
    scanf("%d", &n);
    scanf("%d", &c);
    ans += c;
    Insert(rt, c);
    for (int i = 2;i <= n;++i)
    {
        int tmp = INF;
        scanf("%d", &c);
        pos = 0;
        pre(rt, c);
        if (pos != 0)tmp = min(tmp, abs(t[pos].v - c));
        pos = 0;
        suf(rt, c);
        if (pos != 0)tmp = min(tmp, abs(t[pos].v - c));
        Insert(rt, c);
        ans += tmp;
    }
    printf("%d\n", ans);
    return 0;
}

[洛谷P2234][HNOI2002] 营业额统计 - Treap的更多相关文章

  1. 洛谷P2234 [HNOI2002] 营业额统计 [splay]

    题目传送门 营业额统计 题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天 ...

  2. 洛谷 2234 [HNOI2002]营业额统计——treap(入门)

    题目:https://www.luogu.org/problemnew/show/P2234 学习了一下 treap 的写法. 学习材料:https://blog.csdn.net/litble/ar ...

  3. 洛谷P2234 [HNOI2002]营业额统计

    题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是 ...

  4. 洛谷 P2234 [HNOI2002]营业额统计

    题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是 ...

  5. 洛谷P2234 [HNOI2002]营业额统计(01Tire树)

    题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是 ...

  6. 洛谷—— P2234 [HNOI2002]营业额统计

    https://www.luogu.org/problem/show?pid=2234 题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业 ...

  7. 洛谷.2234.[HNOI2002]营业额统计(Splay)

    题目链接 //模板吧 #include<cstdio> #include<cctype> #include<algorithm> using namespace s ...

  8. [luogu P2234] [HNOI2002]营业额统计

    [luogu P2234] [HNOI2002]营业额统计 题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司 ...

  9. SET || BZOJ 1588: [HNOI2002]营业额统计 || Luogu P2234 [HNOI2002]营业额统计

    题面:P2234 [HNOI2002]营业额统计 题解:随便写写 注意:cmath中abs函数返回的是一个浮点数,在bzoj上会ce 代码: #include<cstdio> #inclu ...

随机推荐

  1. MSIL实用指南-字段的加载和保存

    字段有静态字段和非静态字段之分,它们的加载保存指令也是不一样的,并且非静态字段要生成this. 静态字段的加载加载静态字段的指令是Ldsfld.ilGenerator.Emit(OpCodes.Lds ...

  2. Dell服务器系统安装后无法正常进入系统

    问题描述: 正常安装完系统后,重启,出现无法进入系统 问题解决: 此问题出现意味着系统引导项出现错误,进入raid配置里设置相应的所装系统盘为boot引导项:

  3. 配置CNPM-基础案例

    下面给出一个样例配置: JavaScript module.exports = { enableCluster: true, database: { db: "snpm", use ...

  4. Mysql5.7动态修改innodb_buffer_pool_size

    SELECT @@innodb_buffer_pool_size,@@innodb_buffer_pool_chunk_size,@@innodb_buffer_pool_instances; SET ...

  5. 快速理解web语义化

    什么是Web语义化 Web语义化是指使用恰当语义的html标签.class类名等内容,让页面具有良好的结构与含义,从而让人和机器都能快速理解网页内容.语义化的web页面一方面可以让机器在更少的人类干预 ...

  6. 最小生成数(并查集)Kruskal算法

    并查集:使用并查集可以把每个连通分量看作一个集合,该集合包含连通分量的所有点.这两两连通而具体的连通方式无关紧要,就好比集合中的元素没有先后顺序之分,只有属于和不属于的区别.#define N 100 ...

  7. reinterpret_cast,static_cast, dynamic_cast,const_cast的运用分析

    reinterpret_cast(重新解释类型转换) reinterpret_cast 最famous的特性就是什么都可以,转换任意的类型,包括C++所有通用类型,所以也最不安全 应用 整形和指针之间 ...

  8. 【Python】 uuid生成唯一ID

    uuid uuid是128位的全局唯一标识符(univeral unique identifier),通常用32位的一个字符串的形式来表现.有时也称guid(global unique identif ...

  9. 【R语言系列】read.table报错incomplete final line found by readTableHeader

    文件内容: id,SGBH,DMSM1,SGDO,SGFSSJ 1,310117620,伤人事故,上海市,2018-03-02 20:04:00 2,310117621,死亡事故,杭州市,2018-0 ...

  10. C程序第一次作业

    1-1 计算两数的和与差 1 设计思路 (1)主要描述题目算法 第一步:利用指针psum接收sum的地址,指针pdiff接收diff的地址,因此 * psum为sum, * pdiff为diff. 第 ...