一、题目

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

顺便附上原题链接→_→Problem1588. -- [HNOI2002]营业额统计

二、代码实现

裸treap,没什么好说的┑( ̄Д  ̄)┍

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<algorithm>
 4 using namespace std;
 5 const int MAXN=5e4+10;
 6 const int INF=1e9+1e8;
 7 int n;
 8 struct node
 9 {
10     int key,pri,l,r;//关键字、优先级、左儿子编号、右儿子编号
11 }tr[MAXN];
12 int root,p,s,ptot;
13 void query_pre(int k,int x)
14 {
15     if(!k)return;
16     if(x<tr[k].key)query_pre(tr[k].l,x);
17     else
18     {
19         p=tr[k].key;
20         query_pre(tr[k].r,x);
21     }
22     return;
23 }
24 void query_sub(int k,int x)
25 {
26     if(!k)return;
27     if(x>tr[k].key)query_sub(tr[k].r,x);
28     else
29     {
30         s=tr[k].key;
31         query_sub(tr[k].l,x);
32     }
33     return;
34 }
35 void turn_left(int &k)
36 {
37     int temp=tr[k].r;
38     tr[k].r=tr[temp].l;
39     tr[temp].l=k;
40     k=temp;
41     return;
42 }
43 void turn_right(int &k)
44 {
45     int temp=tr[k].l;
46     tr[k].l=tr[temp].r;
47     tr[temp].r=k;
48     k=temp;
49     return;
50 }
51 void insert(int &k,int x)
52 {
53     if(!k)
54     {
55         k=++ptot;
56         tr[k].key=x;
57         tr[k].pri=rand();
58         return;
59     }
60     if(tr[k].key==x)return;
61     else if(x<tr[k].key)
62     {
63         insert(tr[k].l,x);
64         if(tr[k].pri<tr[tr[k].l].pri)turn_right(k);
65     }
66     else
67     {
68         insert(tr[k].r,x);
69         if(tr[k].pri<tr[tr[k].r].pri)turn_left(k);
70     }
71     return;
72 }
73 int main()
74 {
75     scanf("%d",&n);
76     srand(n);
77     int ans=0;
78     for(int i=1;i<=n;++i)
79     {
80         int x;
81         scanf("%d",&x);
82         if(i==1)ans=x;
83         else
84         {
85             p=-INF,s=INF;
86             query_pre(root,x);
87             query_sub(root,x);
88             ans+=min(x-p,s-x);
89         }
90         insert(root,x);
91     }
92     printf("%d\n",ans);
93     return 0;
94 }

Problem1588. -- [HNOI2002]营业额统计

弱弱地说一句,本蒟蒻码字也不容易,转载请注明出处http://www.cnblogs.com/Maki-Nishikino/p/6236211.html

转载于:https://www.cnblogs.com/Maki-Nishikino/p/6236211.html

【Treap】bzoj1588-HNOI2002营业额统计相关推荐

  1. bzoj1588[HNOI2002]营业额统计

    bzoj1588[HNOI2002]营业额统计 题意: n天,每天得到一个值,要求输出每一天和这天得到的值相差最小的之前天得到的值与这个值的差的和.n不知道,不过O(nlog2n)可写. 题解: 说是 ...

  2. 【链表】BZOJ1588: [HNOI2002]营业额统计

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

  3. bzoj1588 [HNOI2002]营业额统计

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

  4. 洛谷p2234/BZOJ1588 [HNOI2002]营业额统计

    题目链接: 洛谷 BZOJ 分析: 好像没有什么好说的就是一个平衡树的板子--唯一要注意的就是这里要找的并不是严格的前驱和后继,因为如果找到之前某一天的营业额和它相等那么差就是0,所以我们仍然在结构体 ...

  5. bzoj1588[HNOI2002]营业额统计——双向链表

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1588 简单Splay.但用双向链表做.很好的思路. 1.(离线)按值排序,记下pre和nxt ...

  6. P2234 [HNOI2002]营业额统计

    P2234 [HNOI2002]营业额统计 这题没有用splay写,罪过 就是找一下前驱与后继,然后判断一下这个值出现没出现过 判重就是最暴力的拿数组判断就可以了 只不过,值有可能为负数,所以整体平移 ...

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

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

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

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

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

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

最新文章

  1. 洛谷P2904 [USACO08MAR]跨河River Crossing 动态规划
  2. vue-router 源码:路由的安装与初始化
  3. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理
  4. 用fft对信号进行频谱分析实验报告_FFT分析频谱无泄露的条件
  5. 面试题-- 什么是偏向锁
  6. oracle--第一天PLSQL--bai
  7. 好的产品经理都是这样绘制原型图的(下)...
  8. Java开发人员常用网站收录
  9. java分布性_java大型分布系统性能优化实战教程
  10. 转:Android ViewPager多页面滑动切换以及动画效果
  11. ABBYY FineReader PDF for Mac(多功能PDF转换工具)
  12. 机器学习之-BoostedTree
  13. 计算机主机拆解图,电脑的主机结构是怎样的 电脑主机结构图【图文】
  14. 提供小图标(Icon)的网站(不定时更新)
  15. Automatic detection and segmentation of optic disc and fovea in retinal images
  16. 三大运营商流量卡的现状:不兼容,死卡,三网物联卡你选对了吗?
  17. 印刷电路板丝网设计的十大技巧
  18. 干货!ERP在企业财务管理中的应用问题分析与解决办法
  19. librosa 安装
  20. Vue学习25_Vue的异步操作Promise

热门文章

  1. 最长公共上升子序列 LCIS
  2. 微软的研发思路发生改变了 Visual Studio 2012 Update 1抢先看
  3. Android应用中通过AIDL机制实现进程间的通讯实例
  4. 深入理解PHP原理之变量分离/引用(Variables Separation)
  5. 关于进程间通信的学习心得
  6. 路径,文件,目录,I/O常见操作汇总
  7. Linux下用C获取当前系统时间
  8. 一种清除windows通知区域“僵尸”图标的方案——Windows7系统解决方案
  9. Ubuntu14.04 LTS中安装Ruby 2.4源码操作步骤
  10. 【C】printf warning: unknown conversion type character ‘l‘ in format [-Wformat=]