1588: [HNOI2002]营业额统计

Time Limit: 5 Sec Memory Limit: 162 MB

Description

营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。  输入输出要求

Input

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

Output

输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。

Sample Input

6

5

1

2

5

4

6

Sample Output

12

HINT

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

该题数据bug已修复.—-2016.5.15

/*
splay旋转,查找前驱和后继.
数据可能有负数.
cogs上卡读入优化orz.
*/
#include<iostream>
#include<cstdio>
#define MAXN 50001
#define INF 1e9
using namespace std;
int n,tree[MAXN][2],t1,t2,root,fa[MAXN],num[MAXN],size,ans,x1,x2;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void rotate(int x,int &k)
{
int y=fa[x],z=fa[y],l,r;
if(tree[y][0]==x) l=0;else l=1;r=l^1;
if(y==k) k=x;
else {
if(tree[z][0]==y) tree[z][0]=x;//拆.
else tree[z][1]=x;
}
fa[x]=z,fa[y]=x;fa[tree[x][r]]=y;
tree[y][l]=tree[x][r];tree[x][r]=y;
return ;
}
void splay(int x,int &k)
{
int y,z;
while(x!=k)
{
y=fa[x],z=fa[y];
if(y!=k)
{
if((tree[y][0]==x)^(tree[z][0]==y)) rotate(x,k);//共线旋转孙子.
else rotate(y,k);//不共线旋转儿子.
}
rotate(x,k);
}
return ;
}
void add(int &k,int x,int f)//加入元素.
{
if(!k){size++;k=size;num[k]=x;fa[k]=f;splay(k,root);return;}
if(x<num[k]) add(tree[k][0],x,k);//维护二叉树性质.
else add(tree[k][1],x,k);
return ;
}
void before(int k,int x)//查找前驱.
{
if(!k) return ;
if(num[k]<=x){t1=num[k];x1=k;before(tree[k][1],x);}
else before(tree[k][0],x);
return ;
}
void after(int k,int x)//查找后继.
{
if(!k) return ;
if(num[k]>=x){t2=num[k];x2=k;after(tree[k][0],x);}
else after(tree[k][1],x);
return ;
}
int main()
{
freopen("turnover.in","r",stdin);
freopen("turnover.out","w",stdout);
int x;
n=read();
x=read(),add(root,x,0),ans=x;
for(int i=2;i<=n;i++)
{
x=read();//scanf("%d",&x);
x1=x2=0;
before(root,x);
after(root,x);
if(!x1) ans+=t2-x;
else if(!x2) ans+=x-t1;
else ans+=min(x-t1,t2-x);
add(root,x,0);
}
printf("%d",ans);
return 0;
}

Bzoj 1588: [HNOI2002]营业额统计(splay)的更多相关文章

  1. BZOJ 1588: [HNOI2002]营业额统计 双向链表

    BZOJ 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 9619  Solved: 3287 题目连接 ht ...

  2. BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap

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

  3. BZOJ 1588: [HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14396  Solved: 5521[Submit][Sta ...

  4. 数据结构:(平衡树,链表)BZOJ 1588[HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 12173  Solved: 4354[Submit][Sta ...

  5. 1588: [HNOI2002]营业额统计 (splay tree)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 5783  Solved: 1859[Submit][Stat ...

  6. bzoj 1588: [HNOI2002]营业额统计 treap

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 13902  Solved: 5225[Submit][Sta ...

  7. 2018.07.06 BZOJ 1588: HNOI2002营业额统计(非旋treap)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...

  8. SET || BZOJ 1588: [HNOI2002]营业额统计 || Luogu P2234 [HNOI2002]营业额统计

    题面:P2234 [HNOI2002]营业额统计 题解:随便写写 注意:cmath中abs函数返回的是一个浮点数,在bzoj上会ce 代码: #include<cstdio> #inclu ...

  9. bzoj 1588 [HNOI2002] 营业额统计 链表和Splay

    来自HNOI 2002营业额的统计一题,这题以前是用链表水过的,最近看见许多splay的题,赶紧张一下知识. 题目大意就是对于一个序列,输出每个元素与它之前元素的差的最小值的和.先说链表的方法吧. 大 ...

随机推荐

  1. redis源码解读--内存分配zmalloc

    目录 主要函数 void *zmalloc(size_t size) void *zcalloc(size_t size) void zrealloc(void ptr, size_t size) v ...

  2. scratch少儿编程第一季——07、人要衣装佛靠金装——外观模块

    各位小伙伴大家好: 上期我们学习了如何设置背景,和设计一个小项目总结了动作模块. 本期开始我们学习外观模块下的指令. 首先我们来看看前面两个指令 第一个指令是在角色对象上出现一个对话框,显示角色所说的 ...

  3. app实现长按出现弹窗 或者 出现 删除

    <!-- Kpi --> <template> <div class="kpi_container"> <nav-bar :title=& ...

  4. SAS学习笔记29 logistic回归

    变量筛选 当对多个自变量建立logistic回归模型时,并不是每一个自变量对模型都有贡献.通常我们希望所建立的模型将具有统计学意义的自变量都包含在内,而将没有统计学意义的自变量排除在外,即进行变量筛选 ...

  5. java中针对 try和finally一些总结

    结论 1.不管有没有异常,finally中的代码都会执行 2.当try.catch中有return时,finally中的代码依然会继续执行 3.finally是在return后面的表达式运算之后执行的 ...

  6. Apache2.4+Tomcat7.0+php5.5整合配置详解

    在上一篇的基础上,继续添加php的配置 一.首先下载php5.5 首先下载php5.5,到官网下载http://www.php.net/downloads.php,参考http://www.cnblo ...

  7. was控制台无法停止应用

    问题描述: was控制台无法停止应用,只能通过停止server的方式停止: 代码实现: import org.slf4j.Logger; import org.slf4j.LoggerFactory; ...

  8. leetcode-64. 最小路径和 · vector + DP

    题面 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right wh ...

  9. VMware Workstation中虚拟机与windows10共享文件夹

    设置共享文件夹之前需要确定已经安装VMware Tools 1.在windows桌面新建一个名为share_folder的文件夹用来共享 2.右键点击虚拟机的名字,在弹出的菜单中选择设置 弹出对话框 ...

  10. gdb无法单步调试

    使用gdb调试单步程序时如果打印提示“single stepping until exit from function xxx,which has no line number information ...