营业额统计

题目背景

HNOI2002 DAY2 T2

题目描述

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

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

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

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

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

输入格式

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

输出格式

输出一个正整数,即:∑每一天的最小波动值 。结果小于 231 。

样例数据 1

输入







6

输出

12

备注

【样例说明】

$5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12$

【题目分析】

裸体求前去后继。

splay最重要的rotate其实就是下面这幅图

【Code】

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
;
;

struct node{
    node *fa, *lc, *rc;
    int val;
    node(): fa(NULL), lc(NULL), rc(NULL) {}
}pool[N], *rt = NULL, *tail = pool;

inline int which(node *x){
    return x->fa->rc == x;
}

inline void Rotate(node *x){
    node *y = x->fa, *z = y->fa;
    node *b = y->lc == x ? x->rc : x->lc;
    if(b) b->fa = y;
    (y->lc == x? x->rc : x->lc) = y;
    (y->lc == x ? y->lc : y->rc) = b, y->fa = x;

    if(z) (z->lc == y ? z->lc : z->rc) = x;
    x->fa = z;
}

inline void Splay(node *x, node *tar){
    while(x->fa != tar){
        if(x->fa->fa != tar){
            if(which(x) == which(x->fa)) Rotate(x->fa);
            else Rotate(x);
        }
        Rotate(x);
    }
    if(!tar) rt = x;
}

inline void Insert(int val){
    node *x = rt, *fa = NULL,**p = &rt;
    while(x){
        fa = x;
        if(val < x->val) p = &x->lc, x = x->lc;
        else p = &x->rc, x = x->rc;
    }
    x = tail++;
    x->val = val, x->fa = fa;
    x->lc = x->rc = NULL; *p = x;
    Splay(x, NULL);
}

inline int Query(){
    node *x = rt, *pre, *suf;
    pre = x->lc, suf = x->rc;
    if(pre) while(pre->rc) pre = pre->rc;
    if(suf) while(suf->lc) suf = suf->lc;
    if(!pre) return suf->val - x->val;
    if(!suf) return x->val - pre->val;
    return min(suf->val - x->val, x->val - pre->val);
}

int main(){
    scanf("%d%d", &n, &v);
    ans += v, Insert(v);
    ; i <= n; i++){
        v = ;
        scanf("%d", &v);
        Insert(v);
        ans += Query();
    }
    cout<<ans<<endl;
    ;
}

【Splay】例题的更多相关文章

  1. Splay伸展树入门(单点操作,区间维护)附例题模板

    Pps:终于学会了伸展树的区间操作,做一个完整的总结,总结一下自己的伸展树的单点操作和区间维护,顺便给未来的自己总结复习用. splay是一种平衡树,[平均]操作复杂度O(nlogn).首先平衡树先是 ...

  2. splay树入门(带3个例题)

    splay树入门(带3个例题) 首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角.. PS:若代码有误,请尽快与本人联系,我会尽快改正 首先引入一下splay的概念,他的中文名 ...

  3. 第二棵树:Splay

    Splay这东西神难打--什么都没动板子敲上就直逼200行了,而且非常难记(仿佛是模板长的必然结果).但是为什么还要学呢?据说是因为它可以实现区间操作.但是自从我得知无旋Treap也能做到这些,默默对 ...

  4. [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

    转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...

  5. [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

    今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...

  6. 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题

    “队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄>     线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...

  7. splay详解(二)

    前言 在上一节中,我们讲述了Splay的核心操作rotate与splay 本节我会教大家如何用这两个函数实现各种强大的功能 为了方便讲解,我们拿这道题做例题来慢慢分析 利用splay实现各种功能 首先 ...

  8. splay详解(三)

    前言 上一节我们学习了splay所能解决的基本问题,这节我来讲一下splay怎么搞区间问题 实现 splay搞区间问题非常简单,比如我们要在区间$l,r$上搞事情,那么我们首先把$l$的前驱旋转到根节 ...

  9. 算法笔记--Splay && Link-Cut-Tree

    Splay 参考:https://tiger0132.blog.luogu.org/slay-notes 普通模板: ; ], val[N], cnt[N], fa[N], sz[N], lazy[N ...

随机推荐

  1. Common.Logging源码解析一

    Common.Logging是Apache下的一个开源日志接口组件,主要用于切换不同的日志库,因为当前流行的日志库有很多向log4j.log4net(log4j的.net版本)等等,所以为了能灵活的切 ...

  2. Dubbox中开发REST风格的远程调用

    转载: http://zyg345646335.iteye.com/blog/2208899

  3. Django中通过filter和simple_tag为前端实现自定义函数

    Django的模板引擎提供了一般性的功能函数,通过前端可以实现多数的代码逻辑功能,这里称之为一般性,是因为它仅支持大多数常见情况下的函数功能,例如if判断,ifequal对比返回值等,但是稍微复杂一些 ...

  4. 安装ecshop的问题处理

    在安装Ecshop的时候,会遇到几个问题: 1.Strict Standards: Non-static method cls_image::gd_version() should not be ca ...

  5. 基于android的语音识别

    1.注册账户,添加应用 2.针对android平台的选择应用,下载SDK 3.将SDK的libs下文件拷贝到工程的libs目录下 4.添加用户权限 <uses-permission androi ...

  6. PO/VO/POJO/BO/VO图解

  7. python selenium-webdriver 通过cookie登陆(十一)

    上节介绍了浏览器的常用方法,涉及到了cookie的使用,本节介绍一下如何利用cookie进行登陆系统,这里使用到了request模块,我们首先利用request模块,请求登陆地址进行登陆,登陆成功以后 ...

  8. Yii 中出现“<?= ... ?>”是什么意思?

    这是php的标签,和<?php ?>一样的.用<?= ?> 就不用echo,否则你要输出的话,需要加上echo词汇输出.这个就是用在模板里面方便点.

  9. LVS工作模式与调度算法

    LVS三种工作模式.十种调度算法介绍 工作模式介绍: 1.Virtual server via NAT(VS-NAT) 优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,物理服务器可以分配 ...

  10. 【LeetCode】2. Two Sum

    题目: Given an array of integers, find two numbers such that they add up to a specific target number. ...