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. PPT分享 | 以太坊钱包分析与介绍

    艾伯特AI人工智能(公众号:aibbtcom)按: (编者按:本文为姗姗来迟的Meetup系列推文.12月3日,林修平在亚太区以太坊社区培训与交流Meetup深圳站上跟我们分享了他对以太坊各种钱包模式 ...

  2. Linux最佳的云存储服务分析

    什么样的云服务才适合作为 Linux 下的存储服务?兄弟连www.itxdl.cn来帮大家分析一下! 大量的免费空间.毕竟,个人用户无法支付每月的巨额款项. 原生的 Linux 客户端.以便你能够方便 ...

  3. JAVA NIO之文件通道

    1.简介 通道是 Java NIO 的核心内容之一,在使用上,通道需和缓存类(ByteBuffer)配合完成读写等操作.与传统的流式 IO 中数据单向流动不同,通道中的数据可以双向流动.通道既可以读, ...

  4. 基于hi-nginx的web开发(python篇)——起步

    hi-nginx不仅让python web 应用跑得飞快,而且让相关开发变得简单敏捷. 关于hi-nginx的安装,请参考:https://www.cnblogs.com/hi-nginx/p/862 ...

  5. Algorithm --> 两个栈实现队列和两个队列实现栈

    两个栈实现队列和两个队列实现栈 队列(queue)先进先出的线性表:栈(stack)先进后出的线性表. 两个栈实现队列 法一思路: s1是入栈的,s2是出栈的. 入队列:直接压入s1即可: 出队列:如 ...

  6. 网络通信 --> 互联网协议(二)

    互联网协议(二) 一.对上一节的总结 我们已经知道,网络通信就是交换数据包.电脑A向电脑B发送一个数据包,后者收到了,回复一个数据包,从而实现两台电脑之间的通信.数据包的结构,基本上是下面这样: 发送 ...

  7. 微信公众号支付JSAPI网页,total_fee错误不正确,header重定向参数丢失,无法获取订单号和金额解决

    微信公众号支付官方demo错误, 公众号支付只能用在微信里,也就是微信内部浏览器. 1.到WxPayHubHelper.php文件 JsApi_pub()类下createOauthUrlForCode ...

  8. java中的IO 的示例

    字符流 package jd_1; import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileNot ...

  9. Alpha冲刺——Day2

    一.合照 二.项目燃尽图 三.项目进展 图形界面基本完成 接口文档框架完成,接下来将会不断细化填充 登录界面向服务器请求数据进行ing 四.明日规划 1.注册登录接口能够完成 2.研究idea实现获得 ...

  10. Alpha第九天

    Alpha第九天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...