营业额统计

题目背景

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. 以往CSDN博文目录

    专栏一 原生javascript(3篇) 1. javascript立即执行函数详解 http://blog.csdn.net/faith1460/article/details/71600770 2 ...

  2. css3转盘抽奖

    做到一个活动,需要转盘抽奖,于是想到使用css3的动画效果,其中主要包含transition的动画过渡,transform的rotate的旋转效果,在这里只用到2d的旋转, 特别强调的是,因为需要和后 ...

  3. 实现UDP高效接收/响应

    环境Linux g++6.3.0 问题一:一个ip地址如何接收高并发请求 问题二:如何高并发响应消息 发送请求端只能通过ip地址+端口号向服务器发送请求码,所以服务器只能用一个UDP去绑定此ip以及端 ...

  4. node.js搭建代理服务器请求数据

    1.引入node.js中的模块 var http = require("http"); var url = require("url"); var qs = r ...

  5. 使用Azure Policy(策略)强制实现资源Tag的坑

    Azure的Tag(标记)可以帮助运维人员对云资源分类从而方便地进行计费和资源管理.然而在具体实践中工程师部署云资源的时候常常会忘记给资源做标记打Tag. 针对这个问题,Azure的官方文档建议是可以 ...

  6. php检测当前浏览器是否为微信浏览器

    <?php /** php检测当前浏览器是否为微信浏览器 */ function is_weixin_browser(){ if(strpos($_SERVER['HTTP_USER_AGENT ...

  7. empty 和isset的差别

    都可以判定一个变量是否为空:都返回boolean类型,即true或false.isset()用来检测变量是否设置,只能用于变量,因为传递任何其它参数都将造成解析错误.若想检测常量是否已设置,可使用 d ...

  8. Kafka 客户端实现逻辑分析

    这里主要分析kafka 客户端实现 (代码分析以perl kafka实现为准) kafka客户端分为生产者和消费者,生产者发送消息,消费者获取消息. 在kafka协议里客户端通信中用到的最多的四个协议 ...

  9. EntityFramework.Extended.Update.Ambiguous column name

    异常描述 c#代码 dbcontext.Table.Where(x => x.B > 0).Update( x => new Table() { A = x.B } )  抛出异常: ...

  10. 类间调用inline函数的效率

    问题描述: class A { public: int x, y, k, NY; inline int f(int i, int j, int k)  {return ((i)*(NY + 1) * ...