BZOJ 1588: [HNOI2002]营业额统计

Time Limit: 5 Sec  Memory Limit: 512 MB
Submit: 9619  Solved: 3287

题目连接

http://www.lydsy.com/JudgeOnline/problem.php?id=1588

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

此题数据有问题,详见讨论版http://www.lydsy.com/JudgeOnline/wttl/wttl.php?pid=1588

题解:

标答是伸展树,可是不会怎么办?那就可以像我一样哗啦啦的就水过去就好啦
 
啊,就是扔进一个数组里面,排序,然后搞啊搞,找到前驱和后继,不断更新就好啦
 
具体看代码吧,代码很巧~
 
~\(≧▽≦)/~啦啦啦

代码:

//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 400001
#define mod 10007
#define eps 1e-9
//const int inf=0x7fffffff; //无限大
const int inf=0x3f3f3f3f;
/* */
//************************************************************************************** struct node
{
int p,v,left,right;
}a[maxn]; int n,ra[maxn];
inline bool cmp(node a,node b)
{
return a.v<b.v;
}
int main()
{
cin>>n;
for(int i=;i<=n;i++)
{
cin>>a[i].v;
a[i].p=i;
}
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++)
{
ra[a[i].p]=i;
a[i].left=i-;
a[i].right=i+;
}
a[n].right=;
int ans=a[ra[]].v;
for(int i=n;i>;i--)
{ int x=ra[i];
if(a[x].left!=&&a[x].right!=)
{ ans+=min(a[x].v-a[a[x].left].v,a[a[x].right].v-a[x].v);
a[a[x].left].right=a[x].right;
a[a[x].right].left=a[x].left;
}
else if(a[x].left==)
{ ans+=a[a[x].right].v-a[x].v;
a[a[x].right].left=;
}
else
{
ans+=a[x].v-a[a[x].left].v;
a[a[x].left].right=;
} }
cout<<ans<<endl;
return ;
}

最新文章

  1. --关于null在oracle数据库中是否参与计算,进行验证,
  2. CUDA2.1-原理之索引与warp
  3. 微信公众平台中添加qq在线聊天代码
  4. (转载)Bash 中的特殊字符大全
  5. cocos2d-x Mask的实现及优化
  6. 3.4.2内核下的I2C驱动
  7. 判断是否已安装.net framework
  8. cocos2d-x 关于tilemap滚动时黑线闪动的问题
  9. yii 分页样式
  10. 第12届北师大校赛热身赛第二场 A.不和谐的长难句1
  11. MongoDB Sharding
  12. 201521123001《Java程序设计》第11周学习总结
  13. POJ 2084 Catalan数+高精度
  14. mapper代理开发步骤
  15. Red Hat 7.2 RPM安装Mysql 5.7.12
  16. 洛谷P1224 向量内积
  17. Eclipse安装svn插件的几种方式(转)
  18. eclipse 配置打开工作空间
  19. angular4-常用指令
  20. VR/AR 科技了解

热门文章

  1. 【Git】Git与GitHub 入门【转】
  2. HTML语义化(2016/3/16更新)
  3. java基础45 IO流技术(输入字符流/缓冲输入字符流)
  4. java基础41 枚举(类)
  5. 排序与相关性(Sorting and Relevance)
  6. C语言基础 - read()函数读取文本字节导致判断失误的问题
  7. HttpRunner接口自动化测试框架
  8. MySQL 5.1完全卸载
  9. spark java API 实现二次排序
  10. easyui tree tabs