洛谷P2234 [HNOI2002] 营业额统计 [splay]
营业额统计
题目描述
Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。
Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:
当最小波动值越大时,就说明营业情况越不稳定。
而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。
第一天的最小波动值为第一天的营业额。
该天的最小波动值=min{|该天以前某一天的营业额-该天营业额|}。
输入输出格式
输入格式:
输入由文件’turnover.in’读入。
第一行为正整数n(n<=32767) ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数ai(|ai|<=1000000) ,表示第i天公司的营业额,可能存在负数。
输出格式:

输入输出样例
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$,速度还说的过去。
Code:
//It is made by HolseLee on 17th Aug 2018
//Luogu.org P2234
#include<bits/stdc++.h>
#define Max(a,b) (a)>(b)?(a):(b)
#define Min(a,b) (a)<(b)?(a):(b)
#define Abs(a) (a)>0?(a):-(a)
using namespace std; const int inf=1e9;
const int N=1e5+;
int n,tot,root,ans;
struct Node{
int val,num,ch[],fa; void add(int x,int f)
{
ch[]=ch[]=,num=;
fa=f,val=x;
}
}t[N]; inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
} inline void rotate(int x)
{
int y=t[x].fa,z=t[y].fa;
int k=(t[y].ch[]==x);
t[z].ch[t[z].ch[]==y]=x;
t[x].fa=z;
t[t[x].ch[k^]].fa=y;
t[y].ch[k]=t[x].ch[k^];
t[x].ch[k^]=y;
t[y].fa=x;
} inline void splay(int x,int tar)
{
int y,z;
while(t[x].fa!=tar){
y=t[x].fa,z=t[y].fa;
if(z!=tar){
(t[z].ch[]==y)^(t[y].ch[]==x)?rotate(x):rotate(y);
}
rotate(x);
}
if(tar==)root=x;
} inline void insert(int x)
{
int now=root,fa=;
while(now){
if(t[now].val==x)break;
fa=now,now=t[now].ch[x>t[now].val];
}
if(!now){
now=++tot;t[now].add(x,fa);
if(fa)t[fa].ch[x>t[fa].val]=now;
}else{
t[now].num++;
}
splay(now,);
} inline int lower(int x)
{
int ret=-inf,now=root;
while(now){
if(t[now].val==x){
return x;
}else if(t[now].val<x){
ret=Max(ret,t[now].val);
now=t[now].ch[];
}else if(t[now].val>x){
now=t[now].ch[];
}
}
return ret;
} inline int upper(int x)
{
int ret=inf,now=root;
while(now){
if(t[now].val==x){
return x;
}else if(t[now].val>x){
ret=Min(ret,t[now].val);
now=t[now].ch[];
}else if(t[now].val<x){
now=t[now].ch[];
}
}
return ret;
} int main()
{
n=read();
int x,ka,lu;
for(int i=;i<=n;++i){
x=read();
if(i==){
ans+=x;
}else{
ka=Abs(x-lower(x));
lu=Abs(x-upper(x));
ans+=Min(lu,ka);
}
insert(x);
}
printf("%d\n",ans);
return ;
}
洛谷P2234 [HNOI2002] 营业额统计 [splay]的更多相关文章
- 洛谷P2234 [HNOI2002]营业额统计
题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是 ...
- 洛谷 P2234 [HNOI2002]营业额统计
题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是 ...
- [洛谷P2234][HNOI2002] 营业额统计 - Treap
Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额. ...
- 洛谷P2234 [HNOI2002]营业额统计(01Tire树)
题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是 ...
- 洛谷—— P2234 [HNOI2002]营业额统计
https://www.luogu.org/problem/show?pid=2234 题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业 ...
- 洛谷.2234.[HNOI2002]营业额统计(Splay)
题目链接 //模板吧 #include<cstdio> #include<cctype> #include<algorithm> using namespace s ...
- 洛谷 2234 [HNOI2002]营业额统计——treap(入门)
题目:https://www.luogu.org/problemnew/show/P2234 学习了一下 treap 的写法. 学习材料:https://blog.csdn.net/litble/ar ...
- [luogu P2234] [HNOI2002]营业额统计
[luogu P2234] [HNOI2002]营业额统计 题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司 ...
- SET || BZOJ 1588: [HNOI2002]营业额统计 || Luogu P2234 [HNOI2002]营业额统计
题面:P2234 [HNOI2002]营业额统计 题解:随便写写 注意:cmath中abs函数返回的是一个浮点数,在bzoj上会ce 代码: #include<cstdio> #inclu ...
随机推荐
- HDU6127 简单几何 暴力二分
LINK 题意:给出n个点,每个点有个权值,可以和任意另外一点构成线段,值为权值积.现问过原点的直线中交所有线段的权值和的最大值,注意直线必不经过点. 思路:直线可以将点集分为两侧,此时的权值为两侧点 ...
- [BZOJ1911][BZOJ1912][BZOJ1913]APIO2010解题报告
特别行动队 Description 这个好像斜率优化不是一般地明显了啊...只不过要分a的正负两种情况考虑是维护上凸还是下凸 /********************************** ...
- [POJ3370]&[HDU1808]Halloween treats 题解(鸽巢原理)
[POJ3370]&[HDU1808]Halloween treats Description -Every year there is the same problem at Hallowe ...
- css3同心圆闪烁扩散效果
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- HDU 5995 Kblack loves flag (模拟)
题目链接 Problem Description Kblack loves flags, so he has infinite flags in his pocket. One day, Kblack ...
- 绿色的宠物店cms后台管理系统模板——后台
链接:http://pan.baidu.com/s/1c7qmsA 密码:2es8
- 利用Jsoup模拟跳过登录爬虫获取数据
今天在学习爬虫的时候想着学习一下利用jsoup模拟登录.下面分为有验证码和无验证码的情况进行讨论. ---------------------------无验证码的情况---------------- ...
- 关于parse_str变量覆盖分析
这个漏洞有两个姿势.一个是不存在的时候一个是存在的时候. 经过测试该漏洞只在php5.2中存在,其余均不存在. 倘若在parse_str函数使用的代码上方未将其定义那么即存在变量覆盖漏洞否则不行. 还 ...
- 72.Edit Distance---dp
题目链接:https://leetcode.com/problems/edit-distance/description/ 题目大意:找出两个字符串之间的编辑距离(每次变化都只消耗一步). 法一(借鉴 ...
- 设计模式之笔记--外观模式(Facade)
外观模式(Facade) 定义 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 类图 描述 Facade:外观类,外观 ...