BZOJ 1588: [HNOI2002]营业额统计
Description
营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。 输入输出要求
Input
第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i
天公司的营业额。
天数n<=32767,
每天的营业额ai <= 1,000,000。
最后结果T<=2^31
Output
输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。
Sample Input
6
5
1
2
5
4
6
Sample Output
12
HINT
结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12
该题数据bug已修复.—-2016.5.15
Solution
这题是一道裸的平衡树,练算法的好题。
题目是求对于第i个数,求在前i-1个数中、最接近这个数的那个。
这其实就相当于每次插入操作,求前驱和后继。
由于这题只有插入和查询操作,以下代码使用了简短的Splay算法。
Code
#include<cstdio>
using namespace std;
const int N=1<<15+2,MX=1e9;
int tot,root,ans;
int s[N][2],fa[N],key[N];
inline int read()
{int data=0,w=1; char ch=0;while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();if(ch=='-') ch=getchar(),w=-1;while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data*w;
}
inline int min(int x,int y)
{return x<y?x:y;
}
inline bool pd(int x)
{return x==s[fa[x]][1];
}
inline void rotate(int x)
{int y=fa[x],w=pd(x);if(fa[x]=fa[y]) s[fa[y]][pd(y)]=x;fa[s[y][w]=s[x][w^1]]=y;s[fa[y]=x][w^1]=y;
}
inline void splay(int x)
{for(int y;y=fa[x];rotate(x))if(fa[y]) rotate(pd(x)==pd(y)?y:x);root=x;
}
inline void ins(int &x,int y,int v)
{if(!x){x=++tot;fa[x]=y;key[x]=v;return;}ins(s[x][key[x]<=v],x,v);
}
inline int search(int x,int v)
{while(key[x]!=v)if(key[x]<v){if(!s[x][1]) break;x=s[x][1];}else{if(!s[x][0]) break;x=s[x][0];}return x;
}
int main()
{int n=read(),x=read();ins(root,0,ans=x);ins(root,0,MX);ins(root,0,-MX);while(--n){ins(root,0,x=read());splay(tot);int p=search(s[root][0],MX);int q=search(s[root][1],-MX);ans+=min(x-key[p],key[q]-x);}printf("%d",ans);return 0;
}
BZOJ 1588: [HNOI2002]营业额统计相关推荐
- 1588: [HNOI2002]营业额统计 - BZOJ
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- 【链表】BZOJ1588: [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 17555 Solved: 7179 [Submit][S ...
- bzoj1588 [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 17931 Solved: 7391 [Submit][S ...
- [HNOI2002]营业额统计 Splay tree入门题
[HNOI2002]营业额统计 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 [HNOI2002]营业额统计 Time Limit ...
- bzoj1588[HNOI2002]营业额统计
bzoj1588[HNOI2002]营业额统计 题意: n天,每天得到一个值,要求输出每一天和这天得到的值相差最小的之前天得到的值与这个值的差的和.n不知道,不过O(nlog2n)可写. 题解: 说是 ...
- P2234 [HNOI2002]营业额统计
P2234 [HNOI2002]营业额统计 这题没有用splay写,罪过 就是找一下前驱与后继,然后判断一下这个值出现没出现过 判重就是最暴力的拿数组判断就可以了 只不过,值有可能为负数,所以整体平移 ...
- 洛谷P2234 [HNOI2002]营业额统计(01Tire树)
题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是 ...
- 洛谷p2234/BZOJ1588 [HNOI2002]营业额统计
题目链接: 洛谷 BZOJ 分析: 好像没有什么好说的就是一个平衡树的板子--唯一要注意的就是这里要找的并不是严格的前驱和后继,因为如果找到之前某一天的营业额和它相等那么差就是0,所以我们仍然在结构体 ...
- 洛谷P2234 [HNOI2002]营业额统计 set简易解法
题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是 ...
最新文章
- 极限学习机的matlab程序_新程序员七宗罪,新手别踩雷
- 总编下午茶:挑战者心态能否帮助微软重回云计算巅峰?
- Python中的一些“小坑”
- 腾讯225页报告:AI正取代互联网成为新引擎,马化腾提七大关键词
- 一个关于Schema的问题,请求帮助
- SAP VA01 消息 没有用于售达方 XXXXXX 的客户主记录存在
- 阿里云实现首个云上量子加密通讯服务
- 十大最热门人工智能技术
- c语言scan例子,SCAN和C-SCAN算法图解
- Java实验1-1【超市购物小程序】
- 浅谈标签概念及应用场景
- 打造个性QQ,适合网吧做自己安全的QQ
- Ubuntu 安装uwsgi出错
- 谈谈DDD(领域驱动设计)
- 踩坑:云服务器Nginx部署前端遇到http与https问题
- livecd linux 原理,将现有Ubuntu系统做成LiveCD
- python sdk是什么意思_sdk啥意思
- SpringSecurity整合springBoot、redis——实现登录互踢
- 重装oracle接管磁盘阵列,ibm v7000磁盘阵列oracle恢复
- 面对越来越疯狂的勒索病毒,我不能无动于衷-3
热门文章
- Python列表排序 reverse、sort、sorted 操作方法详解
- 吴恩达 coursera ML 第十三课总结+作业答案
- ubuntu查看网关
- fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- MATLAB函数记录
- 【Matlab】编译器和工作区等窗口怎么调整位置?
- [云炬创业基础笔记]第九章企业的法律形态测试4
- python3中map函数_python3中map()和reduce()函数
- CMake3:添加一个库
- PowerDesigner显示注释字段问题