Codevs 1296 营业额统计

题目描述 Description

Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。

Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:

该天的最小波动值 = min|该天以前某一天的营业额−该天营业额|

当最小波动值越大时,就说明营业情况越不稳定。

而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。

第一天的最小波动值为第一天的营业额。

输入描述 Input Description

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

输出描述 Output Description

输出文件仅有一个正整数,即每天最小波动值之和,小于231

样例输入 Sample Input

6
5
1
2
5
4
6

样例输出 Sample Output

12

数据范围及提示 Data Size & Hint

结果说明:5+|1−5|+|2−1|+|5−5|+|4−5|+|6−5|=5+4+1+0+1+1=12

题解

很显然,这道题是一道衤果的Splay树。

手写Splay:

#include <iostream>
#define maxn 50005
#define INF 1E8
using namespace std;
int min(int a, int b)
{
return a < b ? a : b;
}
int abs(int x)
{
return x < 0 ? (-x) : x;
}
struct splay_tree
{
int ch[maxn][2], val[maxn], root, fa[maxn], n;
inline int wson(int x)
{
if(x == ch[fa[x]][0])
return 0;
return 1;
}
inline void rotate(int x)
{
int y = fa[x], z = fa[y], a = wson(x), b = wson(y);
ch[z][b] = x; fa[x] = z;
ch[y][a] = ch[x][!a]; fa[ch[x][!a]] = y;
ch[x][!a] = y; fa[y] = x;
}
inline void splay(int x, int p = 0)
{
while(fa[x] != p)
{
int y = fa[x], z = fa[y];
if(z == p)
rotate(x);
else
{
if(wson(x) == wson(y))
{
rotate(y);
rotate(x);
}
else
{
rotate(x);
rotate(x);
}
}
}
if(!p) root = x;
}
inline void insert(int a)
{
if(!n)
{
n = 1;
root = 1;
val[1] = a;
ch[1][0] = ch[1][1] = fa[1] = 0;
return;
}
int x = root, y;
while(x)
{
y = x;
if(a < val[x])
x = ch[x][0];
else x = ch[x][1];
}
++n;
if(a < val[y])
{
ch[y][0] = n;
val[n] = a;
fa[n] = y;
ch[n][0] = ch[n][1] = 0;
splay(n, 0);
}
else
{
ch[y][1] = n;
val[n] = a;
fa[n] = y;
ch[n][0] = ch[n][1] = 0;
splay(n, 0);
}
}
inline int at(int loc)
{
return val[loc];
}
inline int last(int loc)
{
int x = loc, y;
if(ch[x][0])
{
x = ch[x][0];
while(x)
{
y = x;
x = ch[x][1];
}
splay(y);
return y;
}
y = fa[x];
while(y && x == ch[y][0])
{
x = y;
y = fa[y];
}
splay(y);
return y;
}
inline int next(int loc)
{
int x = loc, y;
if(ch[x][1])
{
x = ch[x][1];
while(x)
{
y = x;
x = ch[x][0];
}
splay(y);
return y;
}
y = fa[x];
while(y && x == ch[y][1])
{
x = y;
y = fa[y];
}
splay(y);
return y;
}
inline int find_lower_bound(int key)
{
int x = root, y;
while(x)
{
y = x;
if(key == val[x])
return x;
else
{
if(key < val[x])
x = ch[x][0];
else x = ch[x][1];
}
}
if(val[y] < key)
return next(y);
splay(y);
return y;
}
};
splay_tree tree;
int main()
{
int n;
tree.insert(INF);
tree.insert(-INF);
cin >> n;
int ans, a, pos, de;
cin >> a;
ans = a;
tree.insert(a);
for(int i = 1; i < n; ++i)
{
cin >> a;
pos = tree.find_lower_bound(a);
de = min(abs(a - tree.at(pos)), abs(tree.at(tree.last(pos)) - a));
ans += de;
tree.insert(a);
}
cout << ans;
return 0;
}

STL模板(STL)大法好!

代码:



据说智商达到180的人才会看到哦~,语文老师告诉我这叫留给读者想象的空间~

Splay树-Codevs 1296 营业额统计的更多相关文章

  1. CJOJ 1308 【HNOI 2002 】营业额统计 / CodeVS 1296 营业额统计(STL,二分)

    CJOJ 1308 [HNOI 2002 ]营业额统计 / CodeVS 1296 营业额统计(STL,二分) Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一 ...

  2. CodeVS 1296 营业额统计

    1296 营业额统计2002年  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master   题目描述 Description Tiger最近被公司升任为营业部经理, ...

  3. codevs 1296 营业额统计 (splay 点操作)

    题目大意 每次加入一个值,并且询问之前加入的数中与该数相差最小的值. 答案输出所有相差值的总和. 解题分析 = = 参考程序 #include <bits/stdc++.h> using ...

  4. 【wikioi】1296 营业额统计

    题目链接:http://www.wikioi.com/problem/1296/ 算法:Splay 这是非常经典的一道题目,用Splay树来维护营业额,每天的最小波动值就等于 min{树根-树根的前驱 ...

  5. splay 1296 营业额统计

    有一个点超时,确实是个很简单的splay#include<cstdio> #include<iostream> using namespace std; int n,shu[1 ...

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

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 这道题貌似很多中做法,我先是用multiset交了一发,然后又写了一发splay. ...

  7. 日常[splay]:水题记——营业额统计

    没错这就是让我深陷splay之中的罪魁祸首,昨天打了一下午结果发现是玄学错误的那个 人生第一棵splay平衡树 题目大意:求一段序列,小于当前元素的最大值和大于当前元素的最小值.从该元素前面的元素找. ...

  8. treap 1296 营业额统计

    有一个点答案错误,求大神指教 #include<cstdio>#include<iostream>#include<cstdlib>#include<ctim ...

  9. AC日记——营业额统计 1296 codevs

    1296 营业额统计 2002年  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Description Tiger ...

随机推荐

  1. HDU5726 GCD(二分 + ST表)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence of N(N≤100, ...

  2. Android开发环境搭建全程演示(jdk+eclipse+android sdk)

    全程演示android开发环境的搭建过程,无需配置环境变量.所有软件都是写该文章时最新版本 一 相关下载 (1) java JDK下载: 进入该网页: http://java.sun.com/java ...

  3. Excel: 公式

    单元格内输入  = xx公式 e.g  =EXACT(C2,D2)   //比较两个单元格内的文本是否相同

  4. BZOJ1036[ZJOI2008]树的统计Count 题解

    题目大意: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.有一些操作:1.把结点u的权值改为t:2.询问从点u到点v的路径上的节点的最大权值 3.询问从点u到点v的路径上的节点的权值和 ...

  5. 20145308刘昊阳 《Java程序设计》第4周学习总结

    20145308刘昊阳 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承与多态 6.1 何谓继承 继承:面向对象中,为避免多个类间重复定义共同行为使用 把相同代码提升为父 ...

  6. ACM zb的生日

    zb的生日 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...

  7. Ubuntu Gnome 14.04.2 lts 折腾笔记

    unity感觉不爽,于是来折腾gnome3 = = 首先去官网下载ubuntu gnome 14.04.2 lts的包(种子:http://cdimage.ubuntu.com/ubuntu-gnom ...

  8. 蒟蒻修养之cf橙名计划2

    29 由于第一篇没写题意导致大部分神题题解已经完全不知道在说啥了...所以还是重开一篇保平安... [303A]题意:求三个长度为$n(n<=10^5)$的排列$a,b,c$使得$a_i+b_i ...

  9. POJ 1106 Transmitters(计算几何)

    题目链接 切计算几何,感觉计算几何的算法还不熟.此题,枚举线段和圆点的直线,平分一个圆 #include <iostream> #include <cstring> #incl ...

  10. BZOJ3653: 谈笑风生

    Description 设T 为一棵有根树,我们做如下的定义:• 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道高明到哪里去了”.• 设a 和 b 为 T 中的两个不同节点.如 ...