HNOI2002(伸展树)
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(伸展树)的更多相关文章
- [Splay伸展树]splay树入门级教程
首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角.. 首先引入一下splay的概念,他的中文名是伸展树,意思差不多就是可以随意翻转的二叉树 PS:百度百科中伸展树读作:BoGa ...
- Splay伸展树学习笔记
Splay伸展树 有篇Splay入门必看文章 —— CSDN链接 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 创造者:Daniel Sleator 和 Robert Ta ...
- 纸上谈兵:伸展树(splay tree)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们讨论过,树的搜索效率与树的深度有关.二叉搜索树的深度可能为n,这种情况下,每次 ...
- SplayTree伸展树的非递归实现(自底向上)
Splay Tree 是二叉查找树的一种,它与平衡二叉树.红黑树不同的是,Splay Tree从不强制地保持自身的平衡,每当查找到某个节点n的时候,在返回节点n的同时,Splay Tree会将节点n旋 ...
- 伸展树(一)之 图文解析 和 C语言的实现
概要 本章介绍伸展树.它和"二叉查找树"和"AVL树"一样,都是特殊的二叉树.在了解了"二叉查找树"和"AVL树"之后, ...
- 伸展树(二)之 C++的实现
概要 上一章介绍了伸展树的基本概念,并通过C语言实现了伸展树.本章是伸展树的C++实现,后续再给出Java版本.还是那句老话,它们的原理都一样,择其一了解即可. 目录1. 伸展树的介绍2. 伸展树的C ...
- 伸展树(三)之 Java的实现
概要 前面分别通过C和C++实现了伸展树,本章给出伸展树的Java版本.基本算法和原理都与前两章一样.1. 伸展树的介绍2. 伸展树的Java实现(完整源码)3. 伸展树的Java测试程序 转载请注明 ...
- hdu1890 伸展树(区间反转)
对于大神来说这题是水题.我搞这题花了快2天. 伸展树的优点有什么,就是树不管你怎么旋转序列是不会改变得,并且你要使区间反转,只要把第k大的点转到根结点,那么它的左子树就是要交换的区间[l,r),然后交 ...
- POJ 3580 (伸展树)
题目链接: http://poj.org/problem?id=3580 题目大意:对一个序列进行以下六种操作.输出MIN操作的结果. 解题思路: 六个操作,完美诠释了伸展树有多么吊.注意,默认使用L ...
随机推荐
- Coloring Trees
Coloring Trees time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- PAT (Advanced Level) 1023. Have Fun with Numbers (20)
手动模拟一下高精度加法. #include<iostream> #include<cstring> #include<cmath> #include<algo ...
- 计算机学院大学生程序设计竞赛(2015’12) 1001 The Country List
#include<cstdio> #include<cstring> #include<cmath> #include<string> #include ...
- 关于JVM内存模型的一些总结
首先上图,了解一下大概结构 1.程序计数器 程序计数器(Program Counter)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工 ...
- STL优先队列的使用
STL中有一个优先队列的容器可以使用. [头文件] queue 队列容器 vector 向量容器 [操作] 优先级队列支持的操作 q.empty() 如果队列为空,则返回true,否则 ...
- MAC OSX 10.10 下安装PHP环境
Apache和PHP已经在系统里面预装好了,只要你开启即可使用.这篇文章给大家介绍如何开启并设置好PHP开发环境. 1.开启默认Apache服务 打开终端命令行,输入如下命令就会开启Apache了.然 ...
- LintCode 面试题 旋转字符串
1.题目描述 题目链接:http://www.lintcode.com/zh-cn/problem/rotate-string/ 给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 2. ...
- NSURL 子串截取
NSURL *url = [NSURL URLWithString:@"http://reg.email.163.com/unireg/call.do?cmd=register.entran ...
- IOS第三方数据库--FMDB
iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...
- address2line 定位 Android c++奔溃位置
Android调用c++出现奔溃,崩溃信息为如下: 10-11 15:15:13.541 D/AudioMTKStreamOut( 139): write(), buffer = 0x42bd9390 ...