【Splay】例题
营业额统计
题目背景
HNOI2002 DAY2 T2
题目描述
Tiger 最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。
Tiger 拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:
该天的最小波动值=min{|该天以前某一天的营业额-该天营业额|}
当最小波动值越大时,就说明营业情况越不稳定。
而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助 Tiger 来计算这一个值(规定:第一天的最小波动值为第一天的营业额)。
输入格式
第一行为正整数 n(n≤32767) ,表示该公司从成立一直到现在的天数。
接下来的 n 行每行有一个正整数 ai(ai≤1000000),表示第 i 天公司的营业额。
输出格式
输出一个正整数,即:∑每一天的最小波动值 。结果小于 231 。
样例数据 1
输入
6
5
1
2
5
4
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】例题的更多相关文章
- Splay伸展树入门(单点操作,区间维护)附例题模板
Pps:终于学会了伸展树的区间操作,做一个完整的总结,总结一下自己的伸展树的单点操作和区间维护,顺便给未来的自己总结复习用. splay是一种平衡树,[平均]操作复杂度O(nlogn).首先平衡树先是 ...
- splay树入门(带3个例题)
splay树入门(带3个例题) 首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角.. PS:若代码有误,请尽快与本人联系,我会尽快改正 首先引入一下splay的概念,他的中文名 ...
- 第二棵树:Splay
Splay这东西神难打--什么都没动板子敲上就直逼200行了,而且非常难记(仿佛是模板长的必然结果).但是为什么还要学呢?据说是因为它可以实现区间操作.但是自从我得知无旋Treap也能做到这些,默默对 ...
- [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...
- [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...
- splay详解(二)
前言 在上一节中,我们讲述了Splay的核心操作rotate与splay 本节我会教大家如何用这两个函数实现各种强大的功能 为了方便讲解,我们拿这道题做例题来慢慢分析 利用splay实现各种功能 首先 ...
- splay详解(三)
前言 上一节我们学习了splay所能解决的基本问题,这节我来讲一下splay怎么搞区间问题 实现 splay搞区间问题非常简单,比如我们要在区间$l,r$上搞事情,那么我们首先把$l$的前驱旋转到根节 ...
- 算法笔记--Splay && Link-Cut-Tree
Splay 参考:https://tiger0132.blog.luogu.org/slay-notes 普通模板: ; ], val[N], cnt[N], fa[N], sz[N], lazy[N ...
随机推荐
- 构建自己的PHP框架--构建模版引擎(2)
自从来到新公司就一直很忙,最近这段时间终于稍微闲了一点,赶紧接着写这个系列,感觉再不写就烂尾了. 之前我们说到,拿到{{ $name }}这样一段内容时,我们只需要将它转化成<?php echo ...
- 一张图搞懂容器所有操作 - 每天5分钟玩转 Docker 容器技术(26)
前面我们已经讨论了容器的各种操作,对容器的生命周期有了大致的理解,下面这张状态机很好地总结了容器各种状态之间是如何转换的. 如果掌握了前面的知识,要看懂这张图应该不难.不过有两点还是需要补充一下: 可 ...
- javascript常用开发笔记:一个简单强大的js日期格式化方法
前言:一直没找到好用的javascript日期格式化工具,自己写了一个,方便以后复用 1.主要功能 (1)支持任意顺序的日期格式排列:yyyy=年,MM=月,dd=日,HH=时,mm=分,ss=秒,s ...
- NodeMCU入门(5):Docker Image 构建固件,开启SmartConfig
准备工作 1.NodeMCU模块 2.ESP8266Flasher.exe 3.EspTouch.apk 3.docker toolbox(win7系统) 或 docker(win10以上),本教程是 ...
- xshell连接ubuntu
安装了 ubuntu-14 ,为了连接 xshell ,做出的一些配置如下: 1.激活root用户 sudo passwd root 设置新密码,设置成功后会有提示 passwd:password u ...
- checkbox全选、全不选实现
<form name=aa1 > <p> <input type=checkbox name="radiot ...
- 我的第一个Java程序
我的第一个Java程序: class Test{ public static void main(String[] args) { System.out.println(" ...
- Ipython 自动重载
一. 使用示例 In [1]: %load_ext autoreload In [2]: %autoreload 2 # Reload all modules (except those exclud ...
- 门(door)
门(door) 时间限制: 1 Sec 内存限制: 128 MB 题目描述 输入 第一行是一个正整数n,表示原始字符串的长度.第二行是一个字符串,长度为n.字符串由大小写字母,数字,符号,空格构成. ...
- 使用CoApp创建NuGet C++静态库包
NuGet是微软开发平台下的包管理软件,使用它你可以非常方便的将一些第三方的库.框架整合进自己的项目中,省去了不少麻烦的配置过程.但是从官方文档上来看,貌似NuGet对C++的支持不是很好,并且在现阶 ...