Description


营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。  输入输出要求

Input


第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i

天公司的营业额。

天数n<=32767,

每天的营业额ai <= 1,000,000。

最后结果T<=2^31

Output


输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。

Sample Input

  1. 6
  2. 5
  3. 1
  4. 2
  5. 5
  6. 4
  7. 6

Sample Output

  1. 12

HINT


结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12

题解


百科treap

文库资料

使用treap维护这个序列,然后O(logn)查询左趋近x和右趋近x的值,从中选最小即可。

  1. #include <queue>
  2. #include <cstdio>
  3. #include <complex>
  4. #include <cstring>
  5. #include <cstdlib>
  6. #include <iostream>
  7. #include <algorithm>
  8. #define ll long long
  9. #define inf 1000000000
  10. #define PI acos(-1)
  11. #define bug puts("here")
  12. #define REP(i,x,n) for(int i=x;i<=n;i++)
  13. #define DEP(i,n,x) for(int i=n;i>=x;i--)
  14. #define mem(a,x) memset(a,x,sizeof(a))
  15. typedef unsigned long long ull;
  16. using namespace std;
  17. inline int read(){
  18. int x=0,f=1;char ch=getchar();
  19. while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
  20. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  21. return x*f;
  22. }
  23. inline void Out(int a){
  24. if(a<0) putchar('-'),a=-a;
  25. if(a>=10) Out(a/10);
  26. putchar(a%10+'0');
  27. }
  28. const int N=500000+5;
  29. int size,root;
  30. struct data{int l,r,v,rnd;}tr[N];
  31. void rturn(int &k){
  32. int t=tr[k].l;
  33. tr[k].l=tr[t].r;
  34. tr[t].r=k;k=t;
  35. }
  36. void lturn(int &k){
  37. int t=tr[k].r;
  38. tr[k].r=tr[t].l;
  39. tr[t].l=k;k=t;
  40. }
  41. void insert(int &k,int x){
  42. if(k==0){
  43. size++;k=size;
  44. tr[k].v=x;tr[k].rnd=rand();
  45. return;
  46. }
  47. if(tr[k].v==x) return;
  48. else if(x<tr[k].v){
  49. insert(tr[k].l,x);
  50. if(tr[tr[k].l].rnd<tr[k].rnd) rturn(k);
  51. }else{
  52. insert(tr[k].r,x);
  53. if(tr[tr[k].r].rnd<tr[k].rnd) lturn(k);
  54. }
  55. }
  56. int t1,t2;
  57. void dfs1(int k,int x){
  58. if(!k) return;
  59. if(x>=tr[k].v){
  60. t1=tr[k].v;
  61. dfs1(tr[k].r,x);
  62. }
  63. else dfs1(tr[k].l,x);
  64. }
  65. void dfs2(int k,int x){
  66. if(!k) return;
  67. if(x<=tr[k].v){
  68. t2=tr[k].v;
  69. dfs2(tr[k].l,x);
  70. }
  71. else dfs2(tr[k].r,x);
  72. }
  73. int main(){
  74. root=size=0;
  75. int n=read(),ans=0;
  76. for(int i=1;i<=n;i++){
  77. int x=read();
  78. t1=-inf;t2=inf;
  79. dfs1(root,x);
  80. dfs2(root,x);
  81. if(i!=1) ans+=min(x-t1,t2-x);
  82. else ans+=x;
  83. insert(root,x);
  84. }
  85. Out(ans);puts("");
  86. return 0;
  87. }

【BZOJ 1588】[HNOI2002] 营业额统计(Treap)的更多相关文章

  1. bzoj 1588: [HNOI2002]营业额统计 treap

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 13902  Solved: 5225[Submit][Sta ...

  2. BZOJ 1588: [HNOI2002]营业额统计 双向链表

    BZOJ 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 9619  Solved: 3287 题目连接 ht ...

  3. BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap

    1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...

  4. 2018.07.06 BZOJ 1588: HNOI2002营业额统计(非旋treap)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...

  5. BZOJ 1588: [HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14396  Solved: 5521[Submit][Sta ...

  6. 数据结构:(平衡树,链表)BZOJ 1588[HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 12173  Solved: 4354[Submit][Sta ...

  7. Bzoj 1588: [HNOI2002]营业额统计(splay)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...

  8. SET || BZOJ 1588: [HNOI2002]营业额统计 || Luogu P2234 [HNOI2002]营业额统计

    题面:P2234 [HNOI2002]营业额统计 题解:随便写写 注意:cmath中abs函数返回的是一个浮点数,在bzoj上会ce 代码: #include<cstdio> #inclu ...

  9. BZOJ 1588 HNOI2002 营业额统计 裸Treap

    题目大意:...题目描写叙述不全看这里好了 给定一个序列 对于每一个元素我们定义该数的最小波动值为这个数与前面全部数的差中的最小值(第一个数的最小波动值为第一个数本身) 求最小波动值之和 找近期的数仅 ...

  10. bzoj 1588 [HNOI2002] 营业额统计 链表和Splay

    来自HNOI 2002营业额的统计一题,这题以前是用链表水过的,最近看见许多splay的题,赶紧张一下知识. 题目大意就是对于一个序列,输出每个元素与它之前元素的差的最小值的和.先说链表的方法吧. 大 ...

随机推荐

  1. 极限和连续 limits + Continue

    上一节我们将导数定义为切线的斜率,这是一种几何解释.我们求出了1/x的斜率为 -1/x2 求出了 f(x) = xn 的斜率是 f”(x) = n*xn-1  这些几何的推导都是根据y-y0  = k ...

  2. C# BitmapData和Marshal.Copy()用法

    C# BitmapData和Marshal.Copy()用法 //此函数用法例子如下: public static byte[] GetGrayArray(Bitmap srcBmp, Rectang ...

  3. Nginx系列篇四:Nginx+keepalived搭建一个高可用的双机双主热备

    建议:先阅读Nginx+keepalived主从配置,因为此篇是接着上篇开始的 上一篇我们简单的介绍了主从配置及其缺点,我们看一下双主热备配置: 2台Nginx+keepalived互为主备,各自绑定 ...

  4. matplotlib 绘图实例01:正弦余弦曲线

    该讲的实例结果如下图所示: 第01步:导入模块,并设置显示中文和负号的属性: import matplotlib.pyplot as plt import numpy as np plt.rcPara ...

  5. 【solr filter 介绍--转】http://blog.csdn.net/jiangchao858/article/details/54989025

    Solr的Analyzer分析器.Tokenizer分词器.Filter过滤器的区别/联系 Analyzer负责把文本字段转成token stream,然后自己处理.或调用Tokenzier和Filt ...

  6. [转]VC++中对文件的写入和读取

    本文转自:http://blog.csdn.net/fanghb_1984/article/details/7425705 本文介绍两种方法对文件进行读取和写入操作:1.采用fstream类:2.采用 ...

  7. java访问数据库步骤详解

    eg1: public static void main(String[] args) throws ClassNotFoundException, SQLException { //第一步:加载JD ...

  8. Javaweb学习笔记2—Tomcat和http协议

      今天来讲javaweb的第二个阶段学习. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的思维导图感兴趣并且想看到你们跟详细的备注信息,请点击下 ...

  9. HYSBZ 1588 营业额统计 (Splay树)

    题意:给出一个公司每一天的营业额,求每天的最小波动值之和.该天的最小波动值= min { 绝对值| 该天以前某一天的营业额-该天的营业额 | }.第一天的最小波动值就是其自己. 思路:Splay伸展树 ...

  10. 洛谷 P2680 运输计划

    题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...