营业额统计

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. PDF 补丁丁 0.5 正式版发布

    经过了两年的测试,新版本的 PDF 补丁丁已经比较稳定了.在农历新年前发布这个 0.5 版,作为正式稳定版吧. 新的 PDF 补丁丁比旧的 0.3 版增加了许多功能: PDF 可视化编辑文档书签,可从 ...

  2. boost库之shared_ptr

    shared_ptr 编辑 目录 1简介 2作用 3历史 4概要 5用法 ▪ 删除共享对象 ▪ 标准容器 1简介编辑 shared_ptr是一种智能指针(smart pointer). 2作用编辑 s ...

  3. arcengine C#关于动态添加图层

    动态加载影像图层为例 研究了两三天算是弄出来了.本例适合影像数据量特别的大程序使用,可以动态的添加删除影像数据,还有不完善的地方,不过基本满足要求. 1.首先得到关键点的图层 m_Map = axMa ...

  4. awk简单用法

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  5. 微信小程序下拉刷新和上拉加载

    小程序知识点二 1.上拉加载和下拉刷新 Wxml文件 <scroll-view scroll-top="{{scrollTop}}" scroll-y="true& ...

  6. 乘方快速幂 OR 乘法快速幂

    关于快速幂这个算法,已经不想多说,很早也就会了这个算法,但是原来一直靠着模板云里雾里的,最近重新学习,发现忽视了一个重要的问题,就是若取模的数大于int型,即若为__int64的时候应该怎么办,这样就 ...

  7. java 自动备份MySQL 数据库(转载)

    1 package com.learn4j.bat; public class Backup { private String user_name;// 数据库用户名 private String u ...

  8. HTML中meta的应用

    meta是用来在HTML文档中模拟HTTP协议的响应头报文.meta 标签用 于网页的<head>与</head>中,meta 标签的用处很多.meta 的属性有两种:name ...

  9. iOS开发——An App ID with identifier "*****" is not avaliable

    Error: An App ID with identifier "*****" is not avaliable. Please enter a different string ...

  10. 推荐一款非常好用的java反编译工具(转)

    源: 推荐一款非常好用的java反编译工具