1588: [HNOI2002]营业额统计

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 15446  Solved: 6076
[Submit][Status][Discuss]

Description

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

Input

第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i
天公司的营业额。
天数n<=32767,
每天的营业额ai <= 1,000,000。
最后结果T<=2^31

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

该题数据bug已修复.----2016.5.15

题意:每次插入一个数,在数列中找到一个数,使得该数与插入的数的差值最小 差值取绝对值 求和输出
题解:平衡树入门 通过旋转 在不影响树的结构的情况下 保持最优的操作效率 splay
  1. #include <bits/stdc++.h>
  2. #define ll long
  3. using namespace std;
  4. ll tim=,n,root,sum=;
  5. bool flag;
  6. struct node
  7. {
  8. ll father,left,right,data;
  9. } tree[];
  10. ll mins(ll aaa, ll bbb)
  11. {
  12. if(aaa<bbb)
  13. return aaa;
  14. else
  15. return bbb;
  16. }
  17. ll abss(ll x)
  18. {
  19. if(x<)
  20. return -x;
  21. else
  22. return x;
  23. }
  24. void rightrotate(ll x)
  25. {
  26. ll y=tree[x].father;
  27. ll z=tree[y].father;
  28. tree[y].left=tree[x].right;
  29. if(tree[x].right!=-)
  30. {
  31. tree[tree[x].right].father=y;
  32. }
  33. tree[x].father=z;
  34. if(z!=-)
  35. {
  36. if(tree[z].left==y) tree[z].left=x;
  37. else tree[z].right=x;
  38. }
  39. tree[x].right=y;
  40. tree[y].father=x;
  41. }
  42. void leftrotate(ll x)
  43. {
  44. ll y=tree[x].father;
  45. ll z=tree[y].father;
  46. tree[y].right=tree[x].left;
  47. if(tree[x].left!=-)
  48. {
  49. tree[tree[x].left].father=y;
  50. }
  51. tree[x].father=z;
  52. if(z!=-)
  53. {
  54. if(tree[z].left==y) tree[z].left=x;
  55. else tree[z].right=x;
  56. }
  57. tree[x].left=y;
  58. tree[y].father=x;
  59. }
  60. void splay(ll x)
  61. {
  62. while(tree[x].father!=-)
  63. {
  64. ll y=tree[x].father;
  65. ll z=tree[y].father;
  66. if(z==-)
  67. {
  68. if(tree[y].left==x) rightrotate(x);
  69. else leftrotate(x);
  70. }
  71. else
  72. {
  73. if(tree[z].left==y&&tree[y].left==x)
  74. {
  75. rightrotate(y);
  76. rightrotate(x);
  77. }
  78. else if(tree[z].left==y&&tree[y].right==x)
  79. {
  80. leftrotate(x);
  81. rightrotate(x);
  82. }
  83. else if(tree[z].right==y&&tree[y].right==x)
  84. {
  85. leftrotate(y);
  86. leftrotate(x);
  87. }
  88. else
  89. {
  90. rightrotate(x);
  91. leftrotate(x);
  92. }
  93. }
  94. }root=x;
  95. }
  96. ll qq(ll x)
  97. {
  98. ll y=tree[x].left;
  99. if(y==-) return y;
  100. while(tree[y].right!=-) y=tree[y].right;
  101. return y;
  102. }
  103. ll hj(ll x)
  104. {
  105. ll y=tree[x].right;
  106. if(y==-) return y;
  107. while(tree[y].left!=-) y=tree[y].left;
  108. return y;
  109. }
  110. int BST_insert(ll dat,ll x)
  111. {
  112. if(dat==tree[x].data)
  113. {
  114. flag=false ;
  115. splay(x);
  116. return ;
  117. }
  118. if(dat<tree[x].data)
  119. {
  120. if(tree[x].left==-)
  121. {
  122. tree[x].left=tim;
  123. tree[tim].father=x;
  124. tree[tim].left=tree[tim].right=-;
  125. tree[tim].data=dat;
  126. }
  127. else
  128. BST_insert(dat,tree[x].left);
  129. }
  130. else
  131. {
  132. if(tree[x].right==-)
  133. {
  134. tree[x].right=tim;
  135. tree[tim].father=x;
  136. tree[tim].left=tree[tim].right=-;
  137. tree[tim].data=dat;
  138. }
  139. else
  140. BST_insert(dat,tree[x].right);
  141. }
  142. }
  143. ll insert1(ll dat)
  144. {
  145. flag=true;
  146. tim++;
  147. BST_insert(dat,root);
  148. if(flag==false) return ;
  149. splay(tim);
  150. ll q=qq(tim);
  151. ll h=hj(tim);
  152. ll minx=;
  153. if(q!=-) minx=mins(minx,abss(tree[q].data-dat));
  154. if(h!=-) minx=mins(minx,abss(tree[h].data-dat));
  155. sum+=minx;
  156. }
  157. int main()
  158. {
  159. int n;
  160. ll aa=;
  161. while(scanf("%d",&n)!=-)
  162. {
  163. sum=;
  164. tim=;
  165. scanf("%ld",&aa);
  166. sum=aa;
  167. tim++;
  168. tree[tim].father=-;
  169. tree[tim].left=tree[tim].right=-;
  170. tree[tim].data=aa;
  171. root=tim;
  172. for(ll i=; i<n; i++)
  173. {
  174. aa=;
  175. scanf("%ld",&aa);
  176. insert1(aa);
  177. }
  178. printf("%ld\n",sum);
  179. }
  180. return ;
  181. }

bzoj 1588 平衡树 splay的更多相关文章

  1. BZOJ 1588 平衡树 模板题

    Treap: //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; int si ...

  2. BZOJ3224/洛谷P3391 - 普通平衡树(Splay)

    BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...

  3. hiho #1329 : 平衡树·Splay

    #1329 : 平衡树·Splay 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. ...

  4. 【BZOJ3224】Tyvj 1728 普通平衡树 Splay

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...

  5. Hihocoder 1329 平衡树·Splay(平衡树)

    Hihocoder 1329 平衡树·Splay(平衡树) Description 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. 小Hi:怎么了? 小Ho:小H ...

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

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

  7. 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay

    [阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...

  8. luoguP3391[模板]文艺平衡树(Splay) 题解

    链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...

  9. 平衡树——splay 三

    前文链接: 平衡树--splay 一 - yi_fan0305 - 博客园 (cnblogs.com) 平衡树--splay 二 - yi_fan0305 - 博客园 (cnblogs.com) 再补 ...

随机推荐

  1. JavaScript(js)处理的HTML事件、键盘事件、鼠标事件

    示例代码: HTML文件: <!DOCTYPE html><html lang="en"><head> <meta charset=&qu ...

  2. conda环境管理

    查看环境 conda env list 创建环境 conda create -n python36 python=3.6 进入环境 source activate python36 activate ...

  3. loadrunner处理https请求

    录制到的脚本如下: login() { lr_think_time(10); web_url("verifycode.jsp", "URL=https://192.168 ...

  4. Planning The Expedition(暴力枚举+map迭代器)

    Description Natasha is planning an expedition to Mars for nn people. One of the important tasks is t ...

  5. Team Work总结 && OPP课程总结

    团队作业总结 工作总结 本次大作业我在团队内的工作是:根据框架构建实现建筑类的功能,包括防御塔.水晶.泉水等建筑.根据架构框架以及结合各建筑的特点,利用继承和多态很快速的解决了一些基本的问题.然而在实 ...

  6. openssl 加密算法 CA 介绍

    首先对于tftp服务的简要使用说明 (1)yum安装:tftp.tftp-server   (2)启动tftp CentOS 6 service xinetd restart chkconfig tf ...

  7. Scrum Meeting Beta - 4

    Scrum Meeting Beta - 4 NewTeam 2017/12/2 地点:新主楼F座二楼 任务反馈 团队成员 完成任务 计划任务 安万贺 完成了部分页面标题栏颜色的修改和字体的调整Iss ...

  8. (双人项目)四则运算 组员:杨钰宁 闫浩楠 开发语言:Python。

    需求分析:1.适用人群:小学生. 2.能进行“+,—,*,/” 的四则运算.难度可以随时修改. 3.提交试卷后可以显示所得分数并显示错题个数. 4.可以显示答对的题及其打错的题的序号. 代码如下: i ...

  9. PAT 甲级 1005 Spell It Right

    https://pintia.cn/problem-sets/994805342720868352/problems/994805519074574336 Given a non-negative i ...

  10. 对mysql联合索引中的字段进行合理排序

    在MySQL的where条件中,有时会用到很多的条件,通常为了加快速度会把这些字段放到联合索引中,可以更快的提高搜索速度: 但是对联合索引中字段顺序的合理排序,便更能提高速度 例子:select * ...