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. IE浏览器清除缓存没用

    再想买更新JS和css文件之后, 使用 internet 里面的删除选项 发现样式和事件还是没用变 最终发现 需要 按 f12 找到这个清缓存才正常解决问题

  2. python学习-字符串前面添加u,r,b的含义

    引用:https://www.cnblogs.com/cq90/p/6959567.html u/U:表示unicode字符串 不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unico ...

  3. 深入理解Java虚拟机(第2版) 笔记目录

    本篇为读深入理解Java虚拟机(第2版)一书的笔记目录. Java 运行期数据区 Java 垃圾回收算法 Java 内存分配策略 Java 类文件结构 Java 加载.链接.初始化 Java 类加载器

  4. 初始化angularJS之ng-app的自动绑定和手动绑定

    在传统的angularJS应用中,都是通过ng-app把angular应用绑定到某个dom上,这样做会把js代码入侵到html上,angular提供了手动启动的API--angular.bootstr ...

  5. 笔记:Spring Cloud Feign 其他配置

    请求压缩 Spring Cloud Feign 支持对请求与响应进行GZIP压缩,以减少通信过程中的性能损耗,我们只需要通过下面二个参数设置,就能开启请求与响应的压缩功能,yml配置格式如下: fei ...

  6. new Date的兼容性问题

    标准浏览器下正常,结果ie.老版本的IOS微信公众号不支持,搞不懂,原来有兼容性问题 //beginData格式为'yyyy-mm-dd' 1 var _date = new Date(Date.pa ...

  7. Java ORM Hibernate 入门笔记

    一.下载 官网地址:http://hibernate.org/ Hibernate下有ORM(关系型数据库).OGM(NoSQL数据库).Search(对象全文检索).Validator的工具. OR ...

  8. JSON字符串转为JSON对象

    在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是对象,所以,JSON对象(js对象)和JSON字符串之间的相互转换是关键. JSON可以有两种格式,一种是对象格式的,另一种是数 ...

  9. 测试对bug如何分析和定位

    如何去区分一个功能测试工程师的水平高和低? 可以从很多个方面去检查,比如测试的思路, 比如测试用例的覆盖度?,比如测试出bug是否能够定位到根因? 上面说的各个方面都很合理,那我们平常如何如更深的定位 ...

  10. android scrollview 属性

     理论部分1.ScrollView和HorizontalScrollView是为控件或者布局添加滚动条2.上述两个控件只能有一个孩子,但是它并不是传统意义上的容器3.上述两个控件可以互相嵌套4.滚动条 ...