NOIP 营业额统计 splay tree 纯模板
2924: 营业额统计
Total Submit: 389 Accepted:122
Description
Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:
该天的最小波动值 = min{ |该天以前某天的营业额 - 该天的营业额 | }
当最小波动值越大时,就说明营业情况越不稳定。而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。第一天的最小波动值为第一天的营业额。
Input
测试数据多组,每组的第一行为正整数n(1 <= n <= 32767), 表示该公司从成立一直到现在的天数. 接下来的n行每行有一个整数Ai(Ai <= 1000000) , 表示第i天的营业额。处理到EOF为止。
Output
每组数据占一行,每行输出一个整数,每天最小波动值的和。结果小于2^31
Sample Input
6
5
1
2
5
4
6
Sample Output
12
Hint
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
using namespace std;
const int N = 1e5+;
const int INF = 0x3f3f3f3f;
int pre[N] , key[N],ch[N][],root,tot1;
int n; void NewNode(int &r ,int father,int k)
{
r = ++tot1;/**保存的位置**/
pre[r] = father;
key[r] = k;
ch[r][] = ch[r][] = ;
} void Rotate(int x,int kind)
{
int y = pre[x]; // x 的父亲节点
ch[y][!kind] = ch[x][kind]; /**建立x的kind节点和父亲节点的关系**/
pre[ch[x][kind]] = y; if(pre[y]) /**建立x节点和x父亲父亲节点的关系**/
{
int k = ch[ pre[y] ] [ ] == y;
ch[pre[y]][k] = x;
}
pre[x] = pre[y]; ch[x][kind] = y; /**建立x和y的关系**/
pre[y] = x;
}
//Splay调整,将结点r调整到goal下面
void Splay(int r , int goal )
{
while(pre[r]!=goal)
{
if( pre[pre[r]] == goal ) Rotate(r,ch[pre[r]][]==r);
else
{
int y = pre[r];
int kind = ch[pre[y]][] == y; /**如果是左节点返回1。否则0。取反的kind**/ if(ch[y][kind] == r)/**r和父亲节点y的位置,和y和其y父亲节点位置不同。**/
{ /**采用 Zig-Zag或Zag-Zig操作**/
Rotate(r,!kind);
Rotate(r,kind);
}
else/**Zig-Zig或Zag-Zag操作**/
{
Rotate(y,kind);
Rotate(r,kind);
}
}
}
if(goal == ) root = r;
} int Insert(int k)
{
int r = root;
while( ch[r][key[r]<k]!=)
{
if( key[r] == k)
{
Splay(r,);
return ;
}
r = ch[r][key[r]<k];
}
NewNode(ch[r][key[r]<k],r,k);
Splay(ch[r][key[r]<k],);
return ;
} int get_pre(int x)
{
int temp = ch[x][];
if(temp == ) return INF;
while(ch[temp][])
temp = ch[temp][];
return key[x] - key[temp];
} int get_next(int x)
{
int temp = ch[x][];
if(temp == ) return INF;
while(ch[temp][])
temp = ch[temp][];
return key[temp] - key[x];
}
int main()
{
int n , x;
while(scanf("%d",&n)>)
{
root = tot1 = ;
int sum = ;
for(int i=;i<=n;i++)
{
scanf("%d",&x);
if(i==)
{
sum = sum + x;
NewNode(root,,x);
continue;
}
if(Insert(x) == ) continue;
int a = get_pre(root);
int b = get_next(root);
sum=sum+min(a,b);
}
printf("%d\n",sum);
}
return ;
}
NOIP 营业额统计 splay tree 纯模板的更多相关文章
- [HNOI2002]营业额统计 Splay tree入门题
题目连接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec ...
- 1588: [HNOI2002]营业额统计 (splay tree)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 5783 Solved: 1859[Submit][Stat ...
- [HNOI2002]营业额统计 Splay tree
Splay tree入门题,学好代码风格,学习HH大牛的,传送门.. #include <functional> #include <algorithm> #include & ...
- BZOJ1588 [HNOI2002]营业额统计 splay模板
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 16189 Solved: 6482 [Submit][S ...
- NOI 2002 营业额统计 (splay or fhq treap)
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- 【BZOJ-1588】营业额统计 Splay
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 12485 Solved: 4508[Submit][Sta ...
- Bzoj 1588: [HNOI2002]营业额统计(splay)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...
- BZOJ1588 HNOI2002 营业额统计 [Splay入门题]
[HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4128 Solved: 1305 Description 营业额统计 ...
- 洛谷P2234 [HNOI2002] 营业额统计 [splay]
题目传送门 营业额统计 题目描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天 ...
随机推荐
- int和long long有符号整形 负数比正数多一个
int的负数比正数多一个,则有一个负数在int范围内没有对应的正数 最大正整数用十六进制,很容易表示:0x7f ff ff ff int num = 0x7fffffff; num = -num; p ...
- Nginx简单配置
Nginx 配置文件结构如果你下载好啦,你的安装文件,不妨打开 conf 文件夹的 nginx.conf 文件,Nginx 服务器的基础配置,默认的配置也存放在此.在 nginx.conf 的注释符号 ...
- Java基础(58):Eclipse中的快捷键大全(转)
Eclipse快捷键大全(转载) Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行 ...
- Socket get http request
package wuyubao.firstsample; import java.io.BufferedReader; import java.io.IOException; import java. ...
- 自定义FragmentTabHost--实现View重复加载问题
1,接着上篇的Fragment+FragmentTabHost搭建简单的底部功能切换框架,效果如下: 结果在项目中用到的时候发现Fragment+FragmentTabHost实现的时候每一次切换底部 ...
- paper 83:前景检测算法_1(codebook和平均背景法)
前景分割中一个非常重要的研究方向就是背景减图法,因为背景减图的方法简单,原理容易被想到,且在智能视频监控领域中,摄像机很多情况下是固定的,且背景也是基本不变或者是缓慢变换的,在这种场合背景减图法的应用 ...
- Oracle存储过程总结
1.存储过程结构 1.1 第一个存储过程 create or replace procedure proc1( para1 varchar2, para2 out varchar2, para3 in ...
- Bonbo Git Server
Install This page covers simple Bonobo Git Server installation. Be sure to check prerequisites page ...
- Linux TTY框架【转】
本文转载自:http://ju.outofmemory.cn/entry/281168 1. 前言 由于串口的缘故,TTY是Linux系统中最普遍的一类设备,稍微了解Linux系统的同学,对它都不陌生 ...
- std::map 自定义排序
PS:开发中难免会用到快速检索的数据结构-map , 很多时候map自身提供的排序不能满足我们的需要或者不支持我们自定的数据结构的排序,解决办法就是自己实现排序. 这里的小案例是:我们要经用户的has ...