BZOJ 1588 营业额统计
Description
营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。 输入输出要求
Input
第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i天公司的营业额。
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
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
#define maxn 33000
int n,share[maxn];
int lc[maxn],rc[maxn],father[maxn],root,ans; inline int small(int a,int b) {if (a < b) return a; return b;} inline void work();
inline void zig(int);
inline void zag(int);
inline int find(int);
inline void ins(int);
inline void splay(int); int main()
{
freopen("1588.in","r",stdin);
freopen("1588.out","w",stdout);
scanf("%d",&n);
int i;
for (i = ;i<=n;i++)
scanf("%d",share+i);
work();
printf("%d",ans);
fclose(stdin); fclose(stdout);
return ;
} inline int find(int a)
{
int ret = ,now = root;
ret = small(abs(share[now]-a),ret);
now = rc[root];
while (now > )
{
if (share[now] == a)
return ;
ret = small(abs(share[now]-a),ret);
if (share[now] > a)
now = rc[now];
else now = lc[now];
}
now = lc[root];
while (now > )
{
if (share[now] == a)
return ;
ret = small(abs(share[now]-a),ret);
if (share[now] > a)
now = rc[now];
else now = lc[now];
}
return ret;
} inline void work()
{
ans = share[]; root = ;
int i,j,k;
for (i = ;i<=n;i++)
{
k = find(share[i]);
ans += k;
if (k != )
ins(i);
}
} inline void ins(int a)
{
int last,now;
now = root;
while (now != )
{
last = now;
if (share[now] > share[a])
now = rc[now];
else now = lc[now];
}
father[a] = last;
if (share[a] > share[last])
lc[last] = a;
else rc[last] = a;
splay(a);
root = a;
} inline void zig(int x)
{
int y = father[x];
father[x] = father[y];
if (father[y] != )
{
if (lc[father[y]] == y)
lc[father[y]] = x;
else rc[father[y]] = x;
}
father[y] = x;
lc[y] = rc[x];
if (rc[x] != )
father[rc[x]] = y;
rc[x] = y;
} inline void zag(int x)
{
int y = father[x];
father[x] = father[y];
if (father[y] != )
{
if (lc[father[y]] == y)
lc[father[y]] = x;
else rc[father[y]] = x;
}
father[y] = x;
rc[y] = lc[x];
if (lc[x] != )
father[lc[x]] = y;
lc[x] = y;
} inline void splay(int a)
{
while (father[a] != )
{
if (father[father[a]] == )
{
if (a == lc[father[a]])
zig(a);
else zag(a);
}
else
{
if (lc[father[father[a]]]==father[a] && lc[father[a]] == a)
{
zig(father[a]),
zig(a);
}
else if (lc[father[father[a]]]==father[a] && rc[father[a]] == a)
{
zag(a);
zig(a);
}
else if (rc[father[father[a]]]==father[a] && lc[father[a]] == a)
{
zig(a);
zag(a);
}
else if (rc[father[father[a]]]==father[a] && rc[father[a]] == a)
{
zag(father[a]);
zag(a);
}
}
}
}
BZOJ 1588 营业额统计的更多相关文章
- BZOJ 1588 营业额统计 set
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1588 题目大意: 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交 ...
- (HYSBZ)BZOJ 1588 营业额统计
营业额统计 Time Limit: 5000MS Memory Limit: 165888KB 64bit IO Format: %lld & %llu Description 营业额 ...
- bzoj 1588营业额统计(HNOI 2002)
http://www.lydsy.com/JudgeOnline/problem.php?id=1588 splay bottom-up的数组实现. 题意就是给你一组数,求每个数与在其前面且与其最相 ...
- BZOJ 1588 营业额统计 Splay
主要操作为Splay中插入节点,查找前驱和后继节点. 1: #include <cstdio> 2: #include <iostream> 3: #include <c ...
- [bzoj] 1588 营业额统计 || Splay板子题
原题 给出一个n个数的数列ai ,对于第i个元素ai定义\(fi=min(|ai-aj|) (1<=j<i)\),f1=a1,求\(/sumfi\) Splay板子题. Splay讲解:h ...
- HYSBZ - 1588 营业额统计 (伸展树)
题意:营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营 ...
- HYSBZ 1588 营业额统计
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 题意:详见题面,中文 思路:平衡树的模板题. 可用Treap,Splay,Scape ...
- HYSBZ 1588 营业额统计 (Splay树)
题意:给出一个公司每一天的营业额,求每天的最小波动值之和.该天的最小波动值= min { 绝对值| 该天以前某一天的营业额-该天的营业额 | }.第一天的最小波动值就是其自己. 思路:Splay伸展树 ...
- BZOJ 1588: [HNOI2002]营业额统计 双向链表
BZOJ 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 9619 Solved: 3287 题目连接 ht ...
随机推荐
- 触发器记录表某一个字段数据变化的日志 包括插入insert 修改update 删除delete 操作
本文参考:http://www.cnblogs.com/lyhabc/articles/3236985.html ,), ), ), ), ...
- Python异常处理 分类: python Raspberry Pi 服务器搭建 2015-04-01 13:22 172人阅读 评论(0) 收藏
一个程序要保持稳定运行必须要有异常处理,本文将简单介绍Python中的try-except..异常处理语句的使用. 该种异常处理语法的规则是: 执行try下的语句,如果引发异常,则执行过程会跳到第一个 ...
- [Angular 2] Keynote: Lazy Routing -- NGCONF
So How to do lazy loading for router in Angular 2. The nomarl way to write a router in Angular 2: Yo ...
- admob广告开始个人资料网址
最近植入广告,数据收集,简单易学. ios http://www.rover12421.com/2013/05/08/ios-add-admob-ads-test-xcode-project-test ...
- Notepad++如何安装并使用source code pro 字体 转
http://blog.yucanlin.cn/2015/04/08/linux-%E5%AE%89%E8%A3%85-source-code-pro-%E5%AD%97%E4%BD%93/ ht ...
- 使用DBOutputFormat把MapReduce产生的结果集导入到mysql中
数据在HDFS和关系型数据库之间的迁移,主要有以下两种方式 1.按照数据库要求的文件格式生成文件,然后由数据库提供的导入工具进行导入 2.采用JDBC的方式进行导入 MapReduce默认提供了DBI ...
- Oracler读取各种格式的相关日期格式
CREATE OR REPLACE Package Pkg_Stm_Date As --Purpose:相关日期处理功能包 --获取某一天是第几周 Function ...
- spring xml 空模板-applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- C#语法糖之开篇
本人虽然大学不是学的计算机但是对于IT行业的热爱,依然决然进军IT行业了,自从踏进这个行业到现在也已经3年多了,从去年开发通过网上 了解博客园后深深的爱上这儿了,这里有很多牛人,通过拜读他们的代码,让 ...
- Android使用 selector 自定义控件背景 (以spinner 为例)
1. 在drawable中设置背景spinner_style.xml 文件 如图: 2. 在 styles.xml 中添加该背景 3. 最后在 spinner 控件添加样式 4.参考 http:// ...