1588: [HNOI2002]营业额统计

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 17931  Solved: 7391
[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裸题,每次找前驱和后继,找前驱的方法是在左子树中找最大的数(一直往右跳),后继就是在右子树中找最小的数(往左跳).需要注意的是每次插入完一个数都要将它翻到上面去.并且要更新根节点!
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int maxn = 40010;struct node
{int fa,left,right,v;
}e[maxn];int n,ans,Time,t,root = 1;
bool flag = true;void turnr(int x)
{int y = e[x].fa;int z = e[y].fa;e[y].left = e[x].right;if (e[x].right != -1)e[e[x].right].fa = y;e[x].fa = z;if (z != -1){if (e[z].left == y)e[z].left = x;elsee[z].right = x;}e[x].right = y;e[y].fa = x;
}void turnl(int x)
{int y = e[x].fa;int z = e[y].fa;e[y].right = e[x].left;if (e[x].left != -1)e[e[x].left].fa = y;e[x].fa = z;if (z != -1){if (e[z].left == y)e[z].left = x;elsee[z].right = x;}e[x].left = y;e[y].fa = x;
}void splay(int x)
{while (e[x].fa != -1){int y = e[x].fa;int z = e[y].fa;if (z == -1){if (x == e[y].left)turnr(x);elseturnl(x);}else{if (e[z].left == y && e[y].left == x){turnr(y);turnr(x);}else{if (e[z].right == y && e[y].right == x){turnl(y);turnl(x);}else{if (e[z].left == y && e[y].right == x){turnl(x);turnr(x);}else{turnr(x);turnl(x);}}}}}root = x;
}void insert(int x,int y)
{if (x == e[y].v){flag = false;splay(y);return;}if (x < e[y].v){if (e[y].left == -1){e[y].left = ++Time;e[Time].left = e[Time].right = -1;e[Time].fa = y;e[Time].v = x;}elseinsert(x,e[y].left);}else{if (e[y].right == -1){e[y].right = ++Time;e[Time].left = e[Time].right = -1;e[Time].fa = y;e[Time].v = x;}elseinsert(x,e[y].right);}
}int findl(int x)
{int y = e[x].left;if (y == -1)return y;while (e[y].right != -1)y = e[y].right;return y;
}int findr(int x)
{int y = e[x].right;if (y == -1)return y;while (e[y].left != -1)y = e[y].left;return y;
}void solve(int x)
{flag = true;insert(x,root);if (!flag)return;splay(Time);int p = findl(Time),q = findr(Time);int temp = 0x7fffffff;if (p != -1)temp = min(temp,abs(x - e[p].v));if (q != -1)temp = min(temp,abs(x - e[q].v));if (temp != 0x7fffffff)ans += temp;
}int main()
{scanf("%d",&n);scanf("%d",&t);ans += t;e[++Time].fa = -1;e[Time].left = -1;e[Time].right = -1;e[Time].v = t;for (int i = 2; i <= n; i++){scanf("%d",&t);solve(t);}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/zbtrs/p/8231725.html

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. 洛谷p2234/BZOJ1588 [HNOI2002]营业额统计

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

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

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

  5. P2234 [HNOI2002]营业额统计

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

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

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

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

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

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

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

  9. 洛谷P2234 [HNOI2002]营业额统计(01Tire树)

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

最新文章

  1. 笔记本蓝牙显示输入码无效_如何凭借一把键盘游走桌面?米物蓝牙双模键盘
  2. nginx产生【413 request entity too large】错误的原因与解决方法
  3. mysql 根据字段映射
  4. 我的Android进阶之旅------Android MediaPlayer播放网络音频的实例--网络mp3播放器
  5. check generated report by SE16
  6. 大小端交换的程序_APP端常见测试功能点
  7. 关于如何使用xposed来hook微信软件
  8. 消息队列---消息模型及使用场景
  9. 背包问题——01背包问题——饭卡
  10. mysql 存储过程简单使用_mysql存储过程的简单使用教程
  11. 最强面试题整理第三弹:Python 后台开发面试题(附答案)
  12. Spyder中文版补丁下载及安装
  13. 悲剧的与幽默的人生态度——宗白华
  14. SaltStacks三:写法和高级状态
  15. python场景文字识别_针对复杂场景的 OCR 文本识别,推荐一个Python 库!
  16. Python数据可视化 Pyecharts 制作 Overlap 层叠多图
  17. transformer and DETR
  18. 计算机专业与导论战德臣答案,计算机专业导论第07讲-程序与递归-组合-抽象-构造.pdf...
  19. Spring AOP统一功能处理(切面、切点、连接点、通知)
  20. opencv实践项目-人脸检测

热门文章

  1. Linux学习之常用技巧
  2. 验证码(captcha)的由来
  3. 安卓 sharedpreferences可以被其它activity读取_Google|再见 SharedPreferences 拥抱 Jetpack DataStore...
  4. Pytorch GRU(详解GRU+torch.nn.GRU()实现)
  5. android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...
  6. 新手上路之django项目开发(二)-----引入静态文件
  7. 前端应该关注的2021年UI设计趋势
  8. 计算机如何学会自动地进行图像美学增强?
  9. ajax 页面无刷新,Ajax的页面无刷新实现详解(附代码)
  10. Android面试题Service,Android面试题-IntentService源码分析