Codevs_P1296 [HNOI2002]营业额统计
来源:互联网 发布:淘宝手机p图教程视频 编辑:程序博客网 时间:2024/06/03 18:09
传送门
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 大师 Master
题解
题目描述 Description
Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。
Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:
该天的最小波动值 = min{|该天以前某一天的营业额-该天营业额|}
当最小波动值越大时,就说明营业情况越不稳定。
而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。
第一天的最小波动值为第一天的营业额。
输入描述 Input Description
第一行为正整数n(n<=32767),表示该公司从成立一直到现在的天数,接下来的n行每行有一个正整数ai(ai<=1000000),表示第i天公司的营业额。
输出描述 Output Description
输出文件仅有一个正整数,即每天最小波动值之和,小于231
样例输入 Sample Input
6
5
1
2
5
4
6
样例输出 Sample Output
12
数据范围及提示 Data Size & Hint
结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12
#include<cstdio>#include<climits>#include<cstdlib>#include<iostream>using namespace std;#define INF INT_MAX/3*2struct SplayTree{ struct Node{ Node *ch[2]; int r,v,s,size; Node(int v,Node* nl):v(v){size=s=1;r=rand();ch[0]=ch[1]=nl;} void maintain(){size=ch[0]->size+s+ch[1]->size;} }*root,*null; SplayTree(){ null=new Node(0,0);null->r=INT_MAX;null->size=null->s=0; null->ch[0]=null->ch[1]=null;root=null; } void rotate(Node* &o,int d){ Node *k=o->ch[d];o->ch[d]=k->ch[d^1];k->ch[d^1]=o; o->maintain();k->maintain();o=k; } void insert(Node* &o,int x){ if(o==null){o=new Node(x,null);return;} if(o->v==x){o->s++,o->size++;return;} insert(o->ch[x>o->v],x); if(o->ch[x>o->v]->r<o->r) rotate(o,x>o->v); else o->maintain(); } void remove(Node* &o,int x){ if(o->v==x){ if(o->s>1){o->s--;o->size--;return;} int d=o->ch[0]->r>o->ch[1]->r; if(o->ch[d]==null){delete o;o=null;return;} rotate(o,d);remove(o->ch[d^1],x); } else remove(o->ch[x>o->v],x); o->maintain(); } int kth(Node *o,int x){ int d=o->ch[0]->size; if(x<=d) return kth(o->ch[0],x); else if(x>d+o->s) return kth(o->ch[1],x-d-o->s); return o->v; } int rank(Node *o,int x){ int d=o->ch[0]->size; if(x<o->v) return rank(o->ch[0],x); else if(x>o->v) return rank(o->ch[1],x)+d+o->s; return d; } int prev(Node *o,int x){ if(o==null) return -INF; if(x==o->v&&o->s>1) return o->v; else if(x<=o->v) return prev(o->ch[0],x); return max(o->v,prev(o->ch[1],x)); } int next(Node* o,int x){ if(o==null) return INF; if(x==o->v&&o->s>1) return o->v; else if(x>=o->v) return next(o->ch[1],x); return min(o->v,next(o->ch[0],x)); }}T;int abs(int x){return x<0?-x:x;}int main(){ srand('B'+'e'+'i'+'Y'+'u'); int n,ans,x,prev,next; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&x);T.insert(T.root,x); if(i==1) {ans=x;continue;} prev=x-T.prev(T.root,x);next=T.next(T.root,x)-x; ans+=min(prev,next); } printf("%d\n",ans); return 0;}
- Codevs_P1296 [HNOI2002]营业额统计
- [HNOI2002]营业额统计 sbt
- HNOI2002营业额统计
- HNOI2002 营业额统计
- [HNOI2002]营业额统计
- HNOI2002 营业额统计 (sbt)
- HNOI2002 - 营业额统计
- [HNOI2002]营业额统计
- 【HNOI2002】营业额统计
- [HNOI2002]营业额统计(SplayTree)
- 1588: [HNOI2002]营业额统计
- [HNOI2002]营业额统计
- [HNOI2002]营业额统计
- hnoi2002 bzoj1588 营业额统计
- [BZOJ1588][HNOI2002]营业额统计
- [HNOI2002]营业额统计
- 1588: [HNOI2002]营业额统计
- HNOI2002 营业额统计
- 聊天机器人--C语言(非智能+初级简单)
- 共享一个ubuntu64位中打包好的Xware Desktop(linux版迅雷下载)(深度和ubuntu14以上的版本都可用)
- Python学习二
- BZOJ 4269: 再见Xor|高斯消元
- HYSBZ/BZOJ 1010 [HNOI2008] 玩具装箱 - dp&斜率优化
- Codevs_P1296 [HNOI2002]营业额统计
- IOS开发:performSelector: withObject:afterDelay 的Object里传入多个参数
- HDU1301 并查集和最小生成树
- Vmware win虚拟机无法上网
- Hibernate框架由myeclipse自动生成遇到的问题
- Docker常用命令
- Children's Game
- NoClassDefFoundError
- 学生信息管理系统-c语言(文本菜单系统)