Time Limit: 5000MS   Memory Limit: 165888KB   64bit IO Format: %lld & %llu

Description

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

Input

第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个正整数 ,表示第i天公司的营业额。

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

Source

HNOI2002
  1. /****Spaly的基本操作和应用****
  2.  
  3. 求前驱与root的差和后驱与root的差,取最大,累加即可.
  4. Rotate写的很精简,是学习别人的;
  5. = =!他的源码有错误,不过却又不影响结果......
  6. 以后看别人的东西也要小心~~
  7.  
  8. *****************************/
  9. #include <map>
  10. #include <set>
  11. #include <list>
  12. #include <queue>
  13. #include <stack>
  14. #include <cmath>
  15. #include <ctime>
  16. #include <vector>
  17. #include <bitset>
  18. #include <cstdio>
  19. #include <string>
  20. #include <numeric>
  21. #include <cstring>
  22. #include <cstdlib>
  23. #include <iostream>
  24. #include <algorithm>
  25. #include <functional>
  26. using namespace std;
  27. typedef long long ll;
  28. typedef unsigned long long ull;
  29.  
  30. #define eps 1e-8
  31. #define inf 0x7fffffff
  32. #define debug puts("BUG")
  33. #define lson l,m,rt<<1
  34. #define rson m+1,r,rt<<1|1
  35. #define read freopen("in.txt","r",stdin)
  36. #define write freopen("out.txt","w",stdout)
  37. #define Mem(a,x) memset(a,x,sizeof(a))
  38. #define maxn 100005
  39.  
  40. int pre[maxn],key[maxn],ch[maxn][2],root,tot1;
  41. //分别表示父结点,键值,左右孩子(0为左孩子,1为右孩子),根结点,结点数量
  42. int n;
  43. int ans;
  44.  
  45. void init()
  46. {
  47. root=tot1=0;
  48. ans=0;
  49. Mem(key,0);
  50. }
  51.  
  52. void NewNode(int &r,int father,int k)
  53. {
  54. r=++tot1; //记录新节点的位置
  55. pre[r]=father;//更新新节点的父亲
  56. key[r]=k;
  57. ch[r][0]=ch[r][1]=0;//左孩子和右孩子为空
  58. }
  59.  
  60. void Rotate(int x,int k)//k为左旋和右旋的标志
  61. {
  62. int y=pre[x];/**记录x的父亲**/
  63.  
  64. ch[y][!k]=ch[x][k];
  65. pre[ch[x][k]]=y;
  66. /**如果k=0, 表示从左到右旋转;如果k=1,表示从右到左旋转
  67. *k=0, 表示x的位置由它的右孩子代替;
  68. *k=1, 表示x的位置由它的左孩子代替.
  69. *x的位置, 即为 !k
  70. **/
  71. if(pre[y])
  72. ch[pre[y]][ch[pre[y]][1]==y]=x;
  73. pre[x]=pre[y];
  74. /** 更新x的父亲 和 x的新父亲的孩子节点(如果新的父亲存在)
  75. * 如上
  76. **/
  77. ch[x][k]=y;
  78. pre[y]=x;
  79. /**更新y的父亲(即为x) 和 x的孩子节点
  80. *如上
  81. **/
  82. }
  83.  
  84. void Splay(int r,int goal)//Splay调整,将r的值调整到目标位置goal
  85. {
  86. while(pre[r]!=goal)
  87. {
  88. if(pre[pre[r]]==goal)//如果r的父亲就是根节点,goal的值为0,直接进行一次旋转即可
  89. {
  90. Rotate(r,ch[pre[r]][0]==r);
  91. }
  92. else//否则
  93. {
  94. int y= pre[r];
  95. int k= ch[pre[y]][0]==y;//记录y与y的父亲的方向
  96. if(ch[y][k]==r)//判断x与y和y的父亲是否在同一方向
  97. {
  98. //是 , 进行一字型旋转
  99. Rotate(r,!k);//先左(右)旋
  100. Rotate(r, k);//后右(左)旋
  101. }
  102. else
  103. {
  104. //否 , 进行之字形旋转
  105. Rotate(y,k);//先对y进行左(右)旋
  106. Rotate(r,k);//后对x进行右(左)旋
  107. }
  108. }
  109. }
  110. /**更新根节点**/
  111. if(goal==0) root=r;
  112. }
  113.  
  114. int Insert(int k) //将键值k插入到Splay中(Splay不为空)
  115. {
  116. int r=root; //从根节点开始
  117. while(ch[r][key[r]<k])
  118. {
  119. //一直向下,找到叶子节点,根据二叉排序树的性质,查找时只需要比较key[r]与k的大小
  120. if(key[r]==k)
  121. {
  122. //同一个值不需要再次插入,只需要进行Splay操作
  123. Splay(r,0);
  124. return 0; //表示插入失败
  125. }
  126. r=ch[r][key[r]<k]; //未找到叶子节点,就需继续向下找
  127. }
  128. if(key[r]==k)
  129. {
  130. //同一个值不需要再次插入,只需要进行Splay操作
  131. Splay(r,0);
  132. return 0; //表示插入失败
  133. }
  134. NewNode(ch[r][k>key[r]],r,k); //新建节点
  135. Splay(ch[r][k>key[r]],0); //Slay操作,插入的节点调整至根节点
  136. return 1; //表示插入成功
  137. }
  138.  
  139. int Get_pre(int x)//寻找前驱,即寻找左子树的最右点
  140. {
  141. int temp=ch[x][0];
  142. if(temp==0) return inf;
  143. while(ch[temp][1])
  144. temp=ch[temp][1];
  145. return key[x]-key[temp];
  146. }
  147.  
  148. int Get_next(int x)//寻找后继,即寻找右子树的最左点
  149. {
  150. int temp=ch[x][1];
  151. if(temp==0) return inf;
  152. while(ch[temp][0])
  153. temp=ch[temp][0];
  154. return key[temp]-key[x];
  155. }
  156. /********************DEBUG***************************/
  157.  
  158. void Puts()
  159. {
  160. printf("root: %d\n",root);
  161. for(int i=1;i<=tot1;i++)
  162. {
  163. printf("node: %d ,l is %d ,r is %d ,key : %d\n",i,ch[i][0],ch[i][1],key[i]);
  164. }
  165. }
  166. /********************DEBUG END***********************/
  167. int main()
  168. {
  169. while(~scanf("%d",&n))
  170. {
  171. init();
  172. for(int i=1; i<=n; i++)
  173. {
  174. int x;
  175. scanf("%d",&x);
  176. if(i==1)
  177. {
  178. ans+=x;
  179. NewNode(root,0,x);//建立Splay的第一个节点
  180. continue;
  181. }
  182. if(Insert(x)==0)//插入,已经存在的值不需要插入
  183. {continue;}
  184. int a=Get_pre(root);//与前驱的差,可能不存在
  185. int b=Get_next(root);//与后驱的差,也可能不存在
  186. ans+=min(a,b);
  187. }
  188. printf("%d\n",ans);
  189. }
  190. return 0;
  191. }

(HYSBZ)BZOJ 1588 营业额统计的更多相关文章

  1. BZOJ 1588 营业额统计

    Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...

  2. BZOJ 1588 营业额统计 set

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1588 题目大意: 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交 ...

  3. bzoj 1588营业额统计(HNOI 2002)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1588 splay  bottom-up的数组实现. 题意就是给你一组数,求每个数与在其前面且与其最相 ...

  4. BZOJ 1588 营业额统计 Splay

    主要操作为Splay中插入节点,查找前驱和后继节点. 1: #include <cstdio> 2: #include <iostream> 3: #include <c ...

  5. [bzoj] 1588 营业额统计 || Splay板子题

    原题 给出一个n个数的数列ai ,对于第i个元素ai定义\(fi=min(|ai-aj|) (1<=j<i)\),f1=a1,求\(/sumfi\) Splay板子题. Splay讲解:h ...

  6. HYSBZ - 1588 营业额统计 (伸展树)

    题意:营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营 ...

  7. HYSBZ 1588 营业额统计

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 题意:详见题面,中文 思路:平衡树的模板题. 可用Treap,Splay,Scape ...

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

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

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

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

随机推荐

  1. tomcat下配置https环境

    在网上搜了一下,内容不是非常完好. 现进行整理,做个学习笔记,以备以后使用. (1)进入到jdk下的bin文件夹 (2)输入例如以下指令"keytool -v -genkey -alias ...

  2. 作为java应届生,面试求职那点事

    找工作两星期多了.心情不爽,写点记录打发时间. 嘘~~自己的破事:  刚毕业,也过了实习,本理所应当的留在公司转正.可是为了谈了两年的女朋友回家见面.一切都顺利进行,妈妈也开心给了一万见面礼,一切都以 ...

  3. hdu4006 优先队列

    A - 签到 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65768KB     64bit I ...

  4. C#检测串口被拔掉等一些触发事件合集

    // //设备异常重载 // protected override void WndProc(ref Message m) { if (m.Msg == 0x0219) {//设备被拔出 if (m. ...

  5. 【原创】C++中对象的序列化

    1.对象序列化 对象的序列化是指将对象的状态信息转换为可以存储或者传输的形式的过程.对象的反序列化是与序列化相反的过程. 在序列化期间,对象将其当前的状态写入到临时或者永久性的存储区,可以通过从存储区 ...

  6. Nutch+Hadoop集群搭建

    转载自:http://www.open-open.com/lib/view/open1328670771405.html 1.Apache Nutch    Apache Nutch是一个用于网络搜索 ...

  7. 高效的jQuery代码编写技巧总结

    最近写了很多的js,虽然效果都实现了,但是总感觉自己写的js在性能上还能有很大的提升.本文我计划总结一些网上找的和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度 ...

  8. meta便签的用法

    1.定义编码规则,<meta http-equiv="Content-Type" content="text/html; charset=utf-8" / ...

  9. 使用nRF51822/nRF51422创建一个简单的BLE应用 ---入门实例手册(中文)之五

    5应用测试 需要一个USB dongle与开发板evaluation kit,并配合Master Control Panel软件,以用于测试BLE应用.前期的准备工作在<nRF51822 Eva ...

  10. Ubuntu apache 禁止目录浏览

    $ sudo vim /etc/apache2/sites-enabled/000-default 将Options后面Indexes前面加上"-"表示禁止目录浏览: <Di ...