BZOJ 1588: [HNOI2002]营业额统计
2015-10-09 13:50
471 查看
1588: [HNOI2002]营业额统计
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 11089 Solved: 3906
Description
营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。 输入输出要求Input
第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i天公司的营业额。Output
输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。Sample Input
65
1
2
5
4
6
Sample Output
12HINT
结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12此题数据有问题,详见讨论版http://www.lydsy.com/JudgeOnline/wttl/wttl.php?pid=1588
Source
解题:Splay乱搞#include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 50010; struct splayTree { int val[maxn],ch[maxn][2],fa[maxn]; int root,tot; void newnode(int &x,int f,int key) { val[x = ++tot] = key; fa[x] = f; ch[x][0] = ch[x][1] = 0; } void init() { root = tot = 0; newnode(root,0,-INF); newnode(ch[root][1],root,INF); } void rotate(int x,int kd) { int y = fa[x]; fa[ch[x][kd]] = y; ch[y][kd^1] = ch[x][kd]; fa[x] = fa[y]; if(fa[x]) ch[fa[y]][y == ch[fa[y]][1]] = x; fa[y] = x; ch[x][kd] = y; } void Splay(int x,int goal) { while(fa[x] != goal) { if(fa[fa[x]] == goal) rotate(x,x == ch[fa[x]][0]); else { int y = fa[x],z = fa[y],f = (ch[z][0] == y); if(ch[y][f] == x) { rotate(x,!f); rotate(x,f); } else { rotate(y,f); rotate(x,f); } } } if(!goal) root = x; } void insert(int key) { int x = root; while(ch[x][val[x] < key]) x = ch[x][val[x] < key]; newnode(ch[x][val[x] < key],x,key); Splay(tot,0); } int precursor(int key) { int x = root,ret = -INF; while(x) { if(val[x] <= key) { ret = max(val[x],ret); x = ch[x][1]; } else x = ch[x][0]; } return ret; } int sucessor(int key) { int x = root,ret = INF; while(x) { if(val[x] >= key) { ret = min(ret,val[x]); x = ch[x][0]; } else x = ch[x][1]; } return ret; } } splay; int main() { int n,tmp,ret; splay.init(); scanf("%d%d",&n,&tmp); ret = tmp; splay.insert(tmp); for(int i = 1; i < n; ++i) { if(scanf("%d",&tmp) == -1) tmp = 0; ret += min(splay.sucessor(tmp) - tmp,tmp - splay.precursor(tmp)); splay.insert(tmp); } printf("%d\n",ret); return 0; }
View Code
相关文章推荐
- Dubbo架构设计详解
- 初识移动端跨平台(JavaScript篇)
- android 学习之基础篇一
- Android性能专项测试之GPU Monitor
- redis php admin
- Reading and Writing using a Large Random Access File
- 2.Python标准库_ 时间与日期 (time, datetime包)
- mysql 查询随机一条记录
- iOS 支付 [支付宝、银联、微信]
- XCode 7上传遇到ERROR ITMS-90535 Unexpected
- 使用word 2013 发布csdn博客
- iOS 编译失败,但是没有错误提示(ios build failed ,but without errors)
- 萧条时期的SEO要如何着手?
- Linux Performance Tools
- VC++ MFC 常用技巧
- Virtual Studio C++ Version Macro - _MSC_VER
- linux下登录mysql
- Krisch Compass Mask(各个方向的边缘)
- data block转储文件初识
- 雅虎34条性能法则