1588. [HNOI2002]营业额统计【平衡树-splay 或 线段树】
Description
营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。 输入输出要求
Input
Output
输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。
Sample Input
5
1
2
5
4
6
Sample Output
HINT
结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12
第一个为线段树做法第二个为平衡树做法
线段树:
设每天的营业额在线段树数组中的下标为他本身的值
然后每次输入一个数时我们先在这个数的左边的区间查找最大值
再在右边的区间查找最小值
(这意味着我们要找比这个数小的最大值和比这个数大的最小值)
然后比较两者取差的绝对值最小的加到Ans里即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN (32767+5)
#define MAX (2000000)
using namespace std; struct node
{
int max,min;
}Segt[MAX*+]; int n,a[MAXN],INF,ans; void Update(int node,int l,int r,int x,int k)
{
if (l==r)
Segt[node].max=Segt[node].min=k;
else
{
int mid=(l+r)/;
if (x<=mid) Update(node*,l,mid,x,k);
if (x>mid) Update(node*+,mid+,r,x,k);
Segt[node].max=max(Segt[node*].max,
Segt[node*+].max);
Segt[node].min=min(Segt[node*].min,
Segt[node*+].min);
}
} int QueryMax(int node,int l,int r,int l1,int r1)
{
if (l>r1||r<l1)
return -INF;
if (l1<=l && r<=r1)
return Segt[node].max;
int mid=(l+r)/;
return max(QueryMax(node*,l,mid,l1,r1),
QueryMax(node*+,mid+,r,l1,r1));
} int QueryMin(int node,int l,int r,int l1,int r1)
{
if (l>r1||r<l1)
return INF;
if (l1<=l && r<=r1)
return Segt[node].min;
int mid=(l+r)/;
return min(QueryMin(node*,l,mid,l1,r1),
QueryMin(node*+,mid+,r,l1,r1));
} int main()
{
memset(&INF,0x7f,sizeof(INF));
for (register int i=;i<=;++i)
Segt[i].min=INF,Segt[i].max=-INF; struct node Segt;
Segt.min=INF;
Segt.max=-INF;
scanf("%d",&n);
for (int i=;i<=n;++i)
{
scanf("%d",&a[i]);
if (i==)
{
Update(,,MAX,a[i]+MAX/,a[i]+MAX/);
ans+=a[i];
continue;
}
int x=QueryMax(,,MAX,,a[i]+MAX/)-MAX/;
int y=QueryMin(,,MAX,a[i]+MAX/,MAX)-MAX/;
Update(,,MAX,a[i]+MAX/,a[i]+MAX/);
ans+=min(abs(a[i]-x),abs(a[i]-y));
}
printf("%d",ans);
}
平衡树:
近乎Splay裸题了……
一天天插入数字,然后查询前驱和后继累加最小值就好了
注意若当前天营业额在之前出现过时(即为Cnt>1)就不用累加了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN (50000)
using namespace std; int Cnt[MAXN];
int Size[MAXN];
int Key[MAXN];
int Father[MAXN];
int Son[MAXN][];
int SIZE,ROOT;
int INF; void Clear(int x)
{
Cnt[x]=Size[x]=Key[x]=Father[x]=Son[x][]=Son[x][]=;
} void Update(int x)
{
if (x)
{
Size[x]+=Cnt[x];
if (Son[x][]) Size[x]+=Cnt[Son[x][]];
if (Son[x][]) Size[x]+=Cnt[Son[x][]];
}
} int Get(int x)
{
return Son[Father[x]][]==x;
} void Rotate(int x)
{
int fa=Father[x];
int fafa=Father[fa];
int wh=Get(x);
Father[fa]=x;
Son[fa][wh]=Son[x][wh^];
if (Son[fa][wh]) Father[Son[fa][wh]]=fa;
Son[x][wh^]=fa;
Father[x]=fafa;
if (fafa) Son[fafa][Son[fafa][]==fa]=x;
Update(fa);
Update(x);
} void Splay(int x)
{
for (int fa;fa=Father[x];Rotate(x))
if (Father[fa])
Rotate(Get(x)==Get(fa)?fa:x);
ROOT=x;
} void Insert(int x)
{
if (ROOT==)
{
ROOT=++SIZE;
Key[SIZE]=x;
Cnt[SIZE]=Size[SIZE]=;
return;
}
int now=ROOT,fa=;
while ()
{
if(Key[now]==x)
{
++Cnt[now];
Update(now);
Splay(now);
return;
}
fa=now;now=Son[now][x>Key[now]];
if (now==)
{
++SIZE;
Key[SIZE]=x;
Cnt[SIZE]=Size[SIZE]=;
Father[SIZE]=fa;
Son[fa][x>Key[fa]]=SIZE;
Update(fa);
Splay(SIZE);
return;
}
}
} int Pre()
{
int now=Son[ROOT][];
if (now==) return INF;
while (Son[now][])
now=Son[now][];
return Key[now];
} int Next()
{
int now=Son[ROOT][];
if (now==) return INF;
while (Son[now][])
now=Son[now][];
return Key[now];
} int main()
{
int n,x,Ans=;
memset(&INF,0x7f,sizeof(INF));
scanf("%d",&n);
for (int i=;i<=n;++i)
{
scanf("%d",&x);
Insert(x);
if (i==)
Ans+=x;
else
if (Cnt[ROOT]<=)
Ans+=min(abs(x-Pre()),abs(x-Next()));
}
printf("%d",Ans);
}
1588. [HNOI2002]营业额统计【平衡树-splay 或 线段树】的更多相关文章
- BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap
1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...
- bzoj 1588: [HNOI2002]营业额统计(splay入门)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 题解:这题如果用普通的bst的话是可以过时间差不多4s左右如果用splay的话是14 ...
- 数据结构:(平衡树,链表)BZOJ 1588[HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 12173 Solved: 4354[Submit][Sta ...
- 1588: [HNOI2002]营业额统计 (splay tree)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 5783 Solved: 1859[Submit][Stat ...
- Bzoj 1588: [HNOI2002]营业额统计(splay)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...
- BZOJ 1588: [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 14396 Solved: 5521[Submit][Sta ...
- 1588: [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 9203 Solved: 3097[Submit][Stat ...
- 2018.07.06 BZOJ 1588: HNOI2002营业额统计(非旋treap)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...
- bzoj 1588: [HNOI2002]营业额统计 treap
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 13902 Solved: 5225[Submit][Sta ...
- BZOJ 1588: [HNOI2002]营业额统计 双向链表
BZOJ 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 9619 Solved: 3287 题目连接 ht ...
随机推荐
- C# Winform程序CPU占用高的原因和解决方法
程序CPU占用高的可能原因: 1.存在死循环: 为什么死循环会导致CPU占用高呢? 虽然分时操作系统是采用时间片的机制对CPU的时间进行管理的,也就是说到了一定时间它会自动从一个进程切换到下 ...
- Spring学习(二)--- Bean 作用域
概述 本文介绍的Spring 中bean的作用域. 问题 : bean的作用域有几种,有那些应用场景 bean 装配过程 下图为bean在容器中从创建到销毁的若干阶段. bean 作用域 作用域介绍 ...
- Cookie写入之path的坑
问题 我在/page/index/index.html中向浏览器添加了一个useid的cookie(这里没有指定path), 然后试着从/page/demo/demo.html中取值,发现无法取到, ...
- log4j2配置文件
项目里面经常用到日志,Java开发一般用log4j.slf4j这些框架,看着配置文件有点懵.这几天看公司代码的时候,也有用到log4j,感觉要复杂一点.在本地打log,也有打到hive里面存的.看了一 ...
- 理解js中bind方法的使用
提到bind方法,估计大家还会想到call方法.apply方法:它们都是Function对象内建的方法,它们的第一个参数都是用来更改调用方法中this的指向.需要注意的是bind 是返回新的函数,以便 ...
- antd-mobile的按需加载
"babel": { "presets": [ "react-app" ] } 主要问题是 依赖项的版本问题 以及 配置问题 新添加的con ...
- python单下划线、双下划线、头尾双下划线说明:
单下划线.双下划线.头尾双下划线说明: __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的. _foo: 以单下划线开头的表示的是 protected 类 ...
- org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.gaiay.business.helper.dao.LiveRegenrationRecordMapper.insert
原因分析: 字段名称.报名.类名 对应不上 ,比如colomn和property属性 反了.. 按以下步骤一一执行: 1:检查xml文件所在的package名称是否和interface对应的packa ...
- Oracle spool 小结
关于SPOOL(SPOOL是SQLPLUS的命令,不是SQL语法里面的东西.) 对于SPOOL数据的SQL,最好要自己定义格式,以方便程序直接导入,SQL语句如: select taskindex|| ...
- CSS标准文档流 块级元素和行内元素
标准文档流 什么是标准文档流 宏观的将,我们的web页面和ps等设计软件有本质的区别,web 网页的制作,是个“流”,从上而下 ,像 “织毛衣”.而设计软件 ,想往哪里画东西,就去哪里画 空白折叠现象 ...