营业额统计

营业额统计 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
    此模板里的查前驱后继是正确的。
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <cmath>
  7. #include <time.h>
  8. #include <string>
  9. #include <map>
  10. #include <stack>
  11. #include <vector>
  12. #include <set>
  13. #include <queue>
  14. #define maxn 102
  15. using namespace std;
  16. const int inf=0x3f3f3f3f;
  17. const int MAXN=2e5+;
  18. int lim;
  19. struct SplayTree {
  20. int sz[MAXN];
  21. int ch[MAXN][];
  22. int pre[MAXN];
  23. int rt,top;
  24. inline void up(int x) {
  25. sz[x] = cnt[x] + sz[ ch[x][] ] + sz[ ch[x][] ];
  26. }
  27. inline void Rotate(int x,int f) {
  28. int y=pre[x];
  29. ch[y][!f] = ch[x][f];
  30. pre[ ch[x][f] ] = y;
  31. pre[x] = pre[y];
  32. if(pre[x]) ch[ pre[y] ][ ch[pre[y]][] == y ] =x;
  33. ch[x][f] = y;
  34. pre[y] = x;
  35. up(y);
  36. }
  37. inline void Splay(int x,int goal) { //将x旋转到goal的下面
  38. while(pre[x] != goal) {
  39. if(pre[pre[x]] == goal) Rotate(x, ch[pre[x]][] == x);
  40. else {
  41. int y=pre[x],z=pre[y];
  42. int f = (ch[z][]==y);
  43. if(ch[y][f] == x) Rotate(x,!f),Rotate(x,f);
  44. else Rotate(y,f),Rotate(x,f);
  45. }
  46. }
  47. up(x);
  48. if(goal==) rt=x;
  49. }
  50. inline void RTO(int k,int goal) { //将第k位数旋转到goal的下面
  51. int x=rt;
  52. while(sz[ ch[x][] ] != k-) {
  53. if(k < sz[ ch[x][] ]+) x=ch[x][];
  54. else {
  55. k-=(sz[ ch[x][] ]+);
  56. x = ch[x][];
  57. }
  58. }
  59. Splay(x,goal);
  60. }
  61. inline void vist(int x) {
  62. if(x) {
  63. printf("结点%2d : 左儿子 %2d 右儿子 %2d %2d sz=%d\n",x,ch[x][],ch[x][],val[x],sz[x]);
  64. vist(ch[x][]);
  65. vist(ch[x][]);
  66. }
  67. }
  68. inline void Newnode(int &x,int c) {
  69. x=++top;
  70. ch[x][] = ch[x][] = pre[x] = ;
  71. sz[x]=;
  72. cnt[x]=;
  73. val[x] = c;
  74. }
  75. inline void init() {
  76. sum=ch[][]=ch[][]=pre[]=sz[]=;
  77. rt=top=;
  78. cnt[]=;
  79. Newnode(rt,-inf);
  80. Newnode(ch[rt][],inf);
  81. pre[top]=rt;
  82. sz[rt]=;
  83. }
  84. inline void Insert(int &x,int key,int f) {
  85. if(!x) {
  86. Newnode(x,key);
  87. pre[x]=f;
  88. Splay(x,);
  89. return ;
  90. }
  91. if(key==val[x]) {
  92. cnt[x]++;
  93. sz[x]++;
  94. Splay(x,);
  95. return ;
  96. } else if(key<val[x]) {
  97. Insert(ch[x][],key,x);
  98. } else {
  99. Insert(ch[x][],key,x);
  100. }
  101. up(x);
  102. }
  103. //找前驱
  104. void findpre(int x,int key,int &ans){
  105. if(!x) return ;
  106. if(val[x] <= key){
  107. ans=val[x];
  108. findpre(ch[x][],key,ans);
  109. } else
  110. findpre(ch[x][],key,ans);
  111. }
  112. void findsucc(int x,int key,int &ans){
  113. if(!x) return ;
  114. if(val[x]>=key) {
  115. ans=val[x];
  116. findsucc(ch[x][],key,ans);
  117. } else
  118. findsucc(ch[x][],key,ans);
  119. }
  120. void del(int &x,int f) {
  121. if(!x) return ;
  122. if(val[x]>=lim) {
  123. del(ch[x][],x);
  124. } else {
  125. sum+=sz[ch[x][]]+cnt[x];
  126. x=ch[x][];
  127. pre[x]=f;
  128. if(f==) rt=x;
  129. del(x,f);
  130. }
  131. if(x) up(x);
  132. }
  133. inline void update() {
  134. del(rt,);
  135. }
  136. inline int find_kth(int x,int k) {
  137. if(k<sz[ch[x][]]+) {
  138. return find_kth(ch[x][],k);
  139. } else if(k > sz[ ch[x][] ] + cnt[x] )
  140. return find_kth(ch[x][],k-sz[ch[x][]]-cnt[x]);
  141. else {
  142. Splay(x,);
  143. return val[x];
  144. }
  145. }
  146. int cnt[MAXN];
  147. int val[MAXN];
  148. int sum;
  149. } spt;
  150. int main() {
  151. int n;
  152. scanf("%d",&n);
  153. spt.init();
  154. int ans=,a;
  155. scanf("%d",&a);
  156. spt.Insert(spt.rt,a,);
  157. ans=a;
  158. n--;
  159. while(n--){
  160. a=;
  161. scanf("%d",&a);
  162. int x,y;
  163. spt.findpre(spt.rt,a,x);
  164. spt.findsucc(spt.rt,a,y);
  165. ans+=min(abs(a-x),abs(a-y));
  166. spt.Insert(spt.rt,a,);
  167. }
  168. printf("%d\n",ans);
  169. return ;
  170. }
  1.  

BZOJ1588 营业额统计 (Splay)的更多相关文章

  1. 【BZOJ-1588】营业额统计 Splay

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

  2. BZOJ1588 HNOI2002 营业额统计 [Splay入门题]

    [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4128  Solved: 1305 Description 营业额统计 ...

  3. BZOJ1588 [HNOI2002]营业额统计 splay模板

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 16189  Solved: 6482 [Submit][S ...

  4. bzoj1588: [HNOI2002]营业额统计(splay)

    1588: [HNOI2002]营业额统计 题目:传送门 题解: 复习splay所以来刷个水... 题目描述不是特别清楚:应该是找第i天以前一个最小的营业额和第i天做差的最小值作为第i天的最小波动值 ...

  5. NOI 2002 营业额统计 (splay or fhq treap)

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

  6. NOIP 营业额统计 splay tree 纯模板

    2924: 营业额统计 Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 389       ...

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

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 5783  Solved: 1859[Submit][Stat ...

  8. 洛谷P2234 [HNOI2002] 营业额统计 [splay]

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

  9. [HNOI2002]营业额统计 Splay tree入门题

    题目连接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec   ...

随机推荐

  1. SQL语句中的换行符

    直接看示例(顺便注意下连接符) 示例1:Access INSERT INTO ZD_DJDCB (DJH,ZDSZ) VALUES ('150105101204JC00428', '北: 地块1' + ...

  2. 手动实现一个lazyMan

    这应该算一个经典的面试题了,就是一个关于流程控制的问题,要求如下 //实现一个LazyMan,可以按照以下方式调用: LazyMan("Hank")//输出: //Hi! This ...

  3. Vue组件编写

    Vue无疑是近来最火的一个前端框架,它吸取了angular1.x和react的精华,性能优良,而且易于上手,本文主要是关于如何去写一个组件. 首先是项目目录 编写组件 在这里我写了一个日期控件(移动端 ...

  4. crontab-用于设置周期性被执行的指令

    一个很好用的工具. 参考文章: [入门] http://baike.baidu.com/view/1229061.htm [进阶] http://blog.csdn.net/tianlesoftwar ...

  5. 关于jdk与jre的区别

    JDK:Java Development Kit JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库.是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程 ...

  6. 更优雅的清除浮动float方法

    上篇文章是利用 :after 方法清除浮动float(作用于浮动元素的父元素上). ; } //为了兼容性,因为ie6/7不能使用伪类,所以加上此行代码. .outer:after {;;visibi ...

  7. IPV4的地址是如何分类的?网络号的范围分别是多少?

    1. A类地址 (1)A类地址第1字节为网络地址,其它3个字节为主机地址. (2)A类地址范围:1.0.0.1—126.255.255.254 (3)A类地址中的私有地址和保留地址: ① 10.X.X ...

  8. 洛谷 P3573 [POI2014]RAJ-Rally 解题报告

    P3573 [POI2014]RAJ-Rally 题意: 给定一个\(N\)个点\(M\)条边的有向无环图,每条边长度都是\(1\). 请找到一个点,使得删掉这个点后剩余的图中的最长路径最短. 输入输 ...

  9. yii2.0查询慢的原因

    最近使用Yii2.0来搭建项目,测试的时候发现无论是请求列表数据还是发布数据,都很慢,然后我一步一步打印时间来查看哪里的问题,始终找不到原因,最后在网上看到这篇: 'db' => [ 'clas ...

  10. HDU 1159 最长公共子序列(n*m)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...