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. openstack中的环境准备

    openstack中环境准备基于Ubuntu系统 author:headsen chen   2017-10-13  11:51:50 个人原创,转载请注明作者,出处. 6 apt-get insta ...

  2. git下载Ardupilot源码

    pwd #确定当前目录 mkdir Copter-3.5.4 #如有需要,新建目录 cd Copter-3.5.4 #进入新目录文件 #克隆指定分支,并且克隆分支对应的git子模块 git clone ...

  3. ASP.NET Core 2.0 : 八.图说管道

    本文通过一张GIF动图来继续聊一下ASP.NET Core的请求处理管道,从管道的配置.构建以及请求处理流程等方面做一下详细的研究.(ASP.NET Core系列目录) 一.概述 上文说到,请求是经过 ...

  4. C语言描述栈的实现及操作(链表实现)

    #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int Elementtype; / ...

  5. java.lang.Thread、java.lang.ThreadGroup和java.lang.ThreadLocal<T>详细解读

    一.Thread类 public class Thread extends Object  impments Runnable 线程是程序中的 执行线程.java虚拟机允许应用程序并发地运行多个执行线 ...

  6. [git 实践篇]如何创建公钥

    如何创建公钥 首先启动一个Git Bash窗口(非Windows用户直接打开终端) 执行: cd ~/.ssh 如果返回"- No such file or directory", ...

  7. CSS3 box-shadow 属性

    定义和用法box-shadow 属性向框添加一个或多个阴影. 默认值: none继承性: no版本: CSS3JavaScript 语法: object.style.boxShadow="1 ...

  8. 多目标跟踪(MOT)论文随笔-SIMPLE ONLINE AND REALTIME TRACKING WITH A DEEP ASSOCIATION METRIC (Deep SORT)

    网上已有很多关于MOT的文章,此系列仅为个人阅读随笔,便于初学者的共同成长.若希望详细了解,建议阅读原文. 本文是tracking by detection 方法进行多目标跟踪的文章,在SORT的基础 ...

  9. 关于hadoop集群下Datanode和Namenode无法访问的解决方案

    HDFS架构 HDFS也是按照Master和Slave的结构,分namenode,secondarynamenode,datanode这几个角色. Namenode:是maseter节点,是大领导.管 ...

  10. 福州大学软工1715|W班-启航

    新的一学期即将开启,而在仅剩的几天的时间内,我将为接下来的软工实践助教事宜忙碌起来.要学习的东西很多,要关注的东西也很多. 虽然我现在还在茫然阶段,虽然我对<构建之法>还不太熟悉,但是,我 ...