营业额统计

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

Submit Status

Description

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

Input

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

Output

输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。

Sample Input

6
5
1
2
5
4
6

Sample Output

12

初学伸展树,先借鉴了他人的模板
 //2016.8.12
#include<iostream>
#include<cstdio>
#include<algorithm> using namespace std; const int N = ;
const int inf = 0x3f3f3f3f;
int root , tot, pre[N], key[N], child[N][];//分别表示根节点、节点总数、父节点、键值、孩子(左0右1) void NewNode(int &r, int father, int k)//创建新节点
{
r = ++tot;
pre[r] = father;
key[r] = k;
child[r][] = child[r][] = ;//叶子节点,孩子为空
} void Rotato(int x, int kind)//旋转,kind为1则右旋,为0则左旋
{
int y = pre[x];
child[y][!kind] = child[x][kind];
pre[child[x][kind]] = y;
if(pre[y])
child[pre[y]][child[pre[y]][]==y] = x;
pre[x] = pre[y];
child[x][kind] = y;
pre[y] = x;
} void Splay(int r, int goal)//Splay调整,将r节点调到goal节点下面
{
while(pre[r] != goal)
{
if(pre[pre[r]]==goal)
Rotato(r, child[pre[r]][]==r);
else
{
int y = pre[r];
int kind = child[pre[y]][]==y;
if(child[y][kind] == r)
{
Rotato(r, !kind);
Rotato(r, kind);
}else
{
Rotato(y, kind);
Rotato(r, kind);
}
}
}
if(goal == )root = r;//更新根节点
} int ins(int k)//插入
{
int r = root;
while(child[r][key[r]<k])
{
if(key[r] == k)//不重复插入
{
Splay(r, );
return ;
}
r = child[r][key[r]<k];
}
NewNode(child[r][key[r]<k], r, k);
Splay(child[r][key[r]<k], );
return ;
} int get_pre(int x)//找前驱
{
int tmp = child[x][];
if(tmp==)return inf;
while(child[tmp][])
{
tmp = child[tmp][];
}
return key[x]-key[tmp];
} int get_next(int x)//找后继
{
int tmp = child[x][];
if(tmp==)return inf;
while(child[tmp][])
{
tmp = child[tmp][];
}
return key[tmp]- key[x];
} int main()
{
int n, ans, num;
while(cin>>n)
{
root = tot = ans = ;
for(int i = ; i < n; i++)
{
scanf("%d", &num);
if(i==)
{
ans+=num;
NewNode(root, , num);
continue;
}
if(ins(num)==)continue;
int l = get_pre(root);
int r = get_next(root);
ans+=min(l, r);
}
printf("%d\n", ans);
} return ;
}

HNOI2002(伸展树)的更多相关文章

  1. [Splay伸展树]splay树入门级教程

    首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角.. 首先引入一下splay的概念,他的中文名是伸展树,意思差不多就是可以随意翻转的二叉树 PS:百度百科中伸展树读作:BoGa ...

  2. Splay伸展树学习笔记

    Splay伸展树 有篇Splay入门必看文章 —— CSDN链接 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 创造者:Daniel Sleator 和 Robert Ta ...

  3. 纸上谈兵:伸展树(splay tree)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们讨论过,树的搜索效率与树的深度有关.二叉搜索树的深度可能为n,这种情况下,每次 ...

  4. SplayTree伸展树的非递归实现(自底向上)

    Splay Tree 是二叉查找树的一种,它与平衡二叉树.红黑树不同的是,Splay Tree从不强制地保持自身的平衡,每当查找到某个节点n的时候,在返回节点n的同时,Splay Tree会将节点n旋 ...

  5. 伸展树(一)之 图文解析 和 C语言的实现

    概要 本章介绍伸展树.它和"二叉查找树"和"AVL树"一样,都是特殊的二叉树.在了解了"二叉查找树"和"AVL树"之后, ...

  6. 伸展树(二)之 C++的实现

    概要 上一章介绍了伸展树的基本概念,并通过C语言实现了伸展树.本章是伸展树的C++实现,后续再给出Java版本.还是那句老话,它们的原理都一样,择其一了解即可. 目录1. 伸展树的介绍2. 伸展树的C ...

  7. 伸展树(三)之 Java的实现

    概要 前面分别通过C和C++实现了伸展树,本章给出伸展树的Java版本.基本算法和原理都与前两章一样.1. 伸展树的介绍2. 伸展树的Java实现(完整源码)3. 伸展树的Java测试程序 转载请注明 ...

  8. hdu1890 伸展树(区间反转)

    对于大神来说这题是水题.我搞这题花了快2天. 伸展树的优点有什么,就是树不管你怎么旋转序列是不会改变得,并且你要使区间反转,只要把第k大的点转到根结点,那么它的左子树就是要交换的区间[l,r),然后交 ...

  9. POJ 3580 (伸展树)

    题目链接: http://poj.org/problem?id=3580 题目大意:对一个序列进行以下六种操作.输出MIN操作的结果. 解题思路: 六个操作,完美诠释了伸展树有多么吊.注意,默认使用L ...

随机推荐

  1. 【HighCharts系列教程】一、认识Highcharts

    一.什么是HighCharts HighCharts是网页报表工具,开发语言是Javascript HighCharts是一个简单易用.美观.跨平台.跨浏览器的图表工具 HighCharts支持图表的 ...

  2. css3的box-sizing--从此不用担心盒模型的不兼容

    前段时间阿里的面试问了关于盒模型的东西,众所周知,ie和标准盒模型是有着区别的.面试官问有没有什么办法可以改变盒模型的显示效果.答案是css3的box-sizing: 其可以取三个值: 1.值cont ...

  3. ibatis一对多 数据库设计及实现

    iBatis的多表关联. ibatis的表关联,和数据库语句无关,是在Java程序中,把若干语句的结果关联到一起.这种关联形式,虽然在大数据量时是很奢侈的行为,但是看起来很干净,用起来也很方便. 这里 ...

  4. Go Runtime hashmap实现

    努力学习go中,看到skoo博客内容很不错, 所以转载学习下 前两天有小伙伴问道是否看过 Go 语言 map 的实现,当时还真没看过,于是就花了一点时间看了一遍 runtime 源码中的 hashma ...

  5. [Unity Physics]Physics - Rigidbody、Collider

    什么是Collider 碰撞器组件在Unity引擎中触发物理碰撞的最基本的条件. 可以这样说,假如一个游戏中没有物理碰撞系统是不可能的. 什么是Rigidbody 通过物理模拟的控制对象的位置. Ri ...

  6. Sping--life cycle

    bean.xml: 注意, 千万不要后面加上 scope="prototype" <?xml version="1.0" encoding="U ...

  7. 防止多个UIAlertView重叠弹出

    http://www.jianshu.com/p/7ac398ef4532 项目中可能会遇到这种情况,好几个alertView因为逻辑关系全部弹出,用户需要一个个的点击才能将所有的alertView取 ...

  8. Android 状态栏通知Notification、NotificationManager详解

    http://www.cnblogs.com/onlyinweb/archive/2012/09/03/2668381.html

  9. laravel安装excel功能

    原文安装链接:https://github.com/Maatwebsite/Laravel-Excel 代码如下: if ($rows = DB::connection('glist')->ta ...

  10. S3C2440的SPI解析

    位串行数据的频率.如果只希望发送,则接收数据可以保持伪位(dummy).此外如果只希望接收,则需要发送伪位'1'数据 使用SPI主要需要以下寄存器 选择SPI模式,中断模式,查询模式等SCK选择,主从 ...