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拿出了公司的账本,账本上记录了公司成立以来每天 ...
随机推荐
- 使用Mysql修改密码命令更改root的密码
使用Mysql修改密码命令更改root的密码. 进入Mysql数据库命令行方式有两种方式: 方式一:在Mysql开始菜单里包含Mysql命令行客户端,只要点击输入root的密码即可进入. 方式二:在D ...
- Lucas
C(n,m)%p=C(n%p,m%p)*C(n/p,m/p)%p 迭代递归 n,m非负整数,p质数 证明 最后一个由二项式定理和p进制数性质得出的我并没有看懂...
- .vimrc文件配置及航意
1. vimrc文件常见语句释义 设定 tab 的位置 :set tabstop=4 输入 tab 时自动将其转化为空格 :set expandtab ...
- uboot.lds (一)
lds文件与scatter文件相似都是决定一个可执行程序的各个段的存储位置,以及入口地址,这也是链接定位的作用.U-boot的lds文件说明如下: SECTIONS{ ... ...
- 自定义FragmentTabHost--实现View重复加载问题
1,接着上篇的Fragment+FragmentTabHost搭建简单的底部功能切换框架,效果如下: 结果在项目中用到的时候发现Fragment+FragmentTabHost实现的时候每一次切换底部 ...
- Oracle中的MD5加密
一.技术点 1. DBMS_OBFUSCATION_TOOLKIT.MD5 DBMS_OBFUSCATION_TOOLKIT.MD5是MD5编码的数据包函数,但偶在使用select DBMS_OBFU ...
- 夺命雷公狗ThinkPHP项目之----企业网站27之网站前台单页的完成(从百度编辑器里面取出文章数据)
我们的单页面里主要是为了可以取出文章分类表的栏目内容,废话先不说, 我们的实现要点: 1...获取get过来的栏目cate_id 2...然后用条件查询栏目表 <?php namespace H ...
- JSP-09-使用EL显示数据
目的:为了使JSP写起来更加简单. 9.1 EL表达式 ${EL表达式} : ${unsername} 操作符: “. ”操作符: 用来访问对象的属性 ${news.title} “[ ...
- 解决filezilla中无法显示中文的文件名
设定字符集时选择自定义字符集, 然后输入字符集为 GBK
- 关闭微软对win10的推送
找到windows中安装的更新,卸载 KB3035583 这个更新即可