【BZOJ1588】【HNOI2002】营业额统计
2016-04-03 20:30
435 查看
【Description】
Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。【Input】
第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i天公司的营业额。【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【Solution】
Splay模板题。重新复习一遍,还算满意。代码如下:
/************************************************************** Problem: 1588 User: llgyc Language: Pascal Result: Accepted Time:292 ms Memory:1248 kb ****************************************************************/ var n,rt,sz,ans:longint; tr:array[0..65536,0..1] of longint; fa,num:array[0..65536] of longint; function min(x,y:longint):longint; begin if x<y then exit(x) else exit(y); end; function f_t(a:boolean):longint; begin if a then exit(1) else exit(0); end; procedure rotate(x,k:longint); var y:longint; begin y:=fa[x]; tr[y,1-k]:=tr[x,k]; if tr[x,k]<>0 then fa[tr[x,k]]:=y; tr[fa[y],f_t(tr[fa[y],1]=y)]:=x; fa[x]:=fa[y]; tr[x,k]:=y; fa[y]:=x; end; procedure splay(x,goal:longint); var y,k:longint; begin while fa[x]<>goal do begin if fa[fa[x]]=goal then rotate(x,f_t(tr[fa[x],0]=x)) else begin y:=fa[x]; k:=f_t(tr[fa[y],0]=y); if tr[y][k]=x then begin rotate(x,1-k); rotate(x,k); end else begin rotate(y,k); rotate(x,k); end; end; end; if goal=0 then rt:=x; end; procedure insert(x,val:longint); var y:longint; begin if sz=0 then begin inc(sz); num[sz]:=val; tr[sz,0]:=0; tr[sz,1]:=0; fa[sz]:=0; tr[0,0]:=sz; rt:=sz; exit; end; while true do begin y:=tr[x,f_t(num[x]<val)]; if y=0 then begin inc(sz); y:=sz; num[y]:=val; tr[y,0]:=0; tr[y,1]:=0; fa[y]:=x; tr[x,f_t(num[x]<val)]:=y; break; end; x:=y; end; splay(y,0); end; function pre(x:longint):longint; var tmp:longint; begin tmp:=tr[x,0]; if tmp=0 then exit(-(maxlongint shr 1)); while (tr[tmp,1]<>0) do tmp:=tr[tmp,1]; exit(num[tmp]); end; function suc(x:longint):longint; var tmp:longint; begin tmp:=tr[x,1]; if tmp=0 then exit(maxlongint shr 1); while (tr[tmp,0]<>0) do tmp:=tr[tmp,0]; exit(num[tmp]); end; procedure main(); var x,a,b,i:longint; begin readln(n); rt:=0; sz:=0; fa[rt]:=0; tr[rt,0]:=0; tr[rt,1]:=0; for i:=1 to n do begin readln(x); insert(rt,x); if i=1 then begin inc(ans,x); continue; end; a:=pre(rt); b:=suc(rt); ans:=ans+min(x-a,b-x); end; writeln(ans); end; begin main(); end.
相关文章推荐
- 文件的切割与合并
- Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflow
- 设计模式之设计原则-单一职责原则
- Linux系统创建一个新的进程
- 备忘
- nginx 配置web 虚拟文件夹 而且codeIgniter,thinkphp 重定向url 地址
- 2nd
- git学习小结
- 训练赛20160403
- App Resources and Resources Overview
- 在一个会话中产生多个连接
- LeetCode OJ刷题历程——Add Digits
- 进程的描述和进程的创建——第六周(20135304刘世鹏)
- Android开发 自定义popupwindow
- hdu 1518 Square【DFS+剪枝】
- websocket资源收集
- ORA-01157:无法标识/锁定数据文件,ORA-01110:表空间丢失错误
- CentOS7开发环境搭建
- mac 安装 nginx 环境
- Ubuntu安装Sublime Text并输入中文