1296 营业额统计

2002年

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 大师 Master
 查看运行结果
 
 
题目描述 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

思路:

  裸treap模板;

  支持插入,寻找前驱、后继操作;

  每次插入一个点

  然后寻找这个点的前驱和后继,比较哪个的波动小然后累加

来,上代码:

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm> using namespace std; struct TreeNode {
int key,fix,weight,size; TreeNode *left,*right;
}; class TreapType {
private:
TreeNode *null,*root,*start; int n,if_z,pos,ans; char Cget; inline void read_int(int &now)
{
now=,if_z=,Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
} public:
TreapType()
{
null=new TreeNode;
null->left=null;
null->right=null;
root=null;
start=new TreeNode;
start->key=0x7ffffff;
start->left=null;
start->right=null;
read_int(n);
read_int(pos);
ans+=abs(pos);
Insert(root,pos);
for(int i=;i<=n;i++)
{
read_int(pos);
Insert(root,pos);
int pre=Predecessor(root,pos,start);
int suc=Successor(root,pos,start);
ans+=min(abs(pre-pos),abs(suc-pos));
}
printf("%d\n",ans);
} void Rotato_Left(TreeNode *&now)
{
TreeNode *tmp=now->right;
now->right=tmp->left;
tmp->left=now;
now=tmp;
now->left->size=now->left->left->size+now->left->weight+now->left->right->size;
now->size=now->left->size+now->right->size+now->weight;
} void Rotato_Right(TreeNode *&now)
{
TreeNode *tmp=now->left;
now->left=tmp->right;
tmp->right=now;
now=tmp;
now->right->size=now->right->left->size+now->right->weight+now->right->left->size;
now->size=now->left->size+now->weight+now->right->size;
} void Insert(TreeNode *&now,int key)
{
if(now==null)
{
now=new TreeNode;
now->fix=rand();
now->key=key;
now->left=null;
now->right=null;
now->size=;
now->weight=;
return ;
}
if(now->key==key)
{
now->weight++;
}
else if(now->key<key)
{
Insert(now->right,key);
if(now->right->fix>now->fix) Rotato_Left(now);
}
else if(now->key>key)
{
Insert(now->left,key);
if(now->left->fix>now->fix) Rotato_Right(now);
}
now->size=now->left->size+now->right->size+now->weight;
} int Predecessor(TreeNode *&now,int key,TreeNode *&optimal)
{
if(now==null) return optimal->key;
if(now->key==key)
{
if(now->weight>) return key;
else return Predecessor(now->left,key,optimal);
}
else
{
if(now->key<key) return Predecessor(now->right,key,now);
else return Predecessor(now->left,key,optimal);
}
} int Successor(TreeNode *&now,int key,TreeNode *&optimal)
{
if(now==null) return optimal->key;
if(now->key==key)
{
if(now->weight>) return key;
else return Successor(now->right,key,optimal);
}
else
{
if(now->key>key) return Successor(now->left,key,now);
else return Successor(now->right,key,optimal);
}
}
};
class TreapType do_; int main()
{
return ;
}

AC日记——营业额统计 1296 codevs的更多相关文章

  1. AC日记——营业额统计 codevs 1296 (splay版)

    营业额统计 思路: 每次,插入一个点: 然后找前驱后继: 来,上代码: #include <cmath> #include <cstdio> #include <iost ...

  2. AC日记——接龙游戏 codevs 1051

    1051 接龙游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 给出了N个单词,已经按长度排好了序.如果 ...

  3. AC日记——数字统计 openjudge 1.5 41

    41:数字统计 总时间限制:  1000ms 内存限制:  65536kB 描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数. 比如给定范围[2, 22],数字2在数2中出现了1次, ...

  4. AC日记——最优贸易 codevs 1173

    题目描述 Description [问题描述]C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路 ...

  5. AC日记——地鼠游戏 codevs 1052

    1052 地鼠游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 王钢是一名学习成绩优异的学生,在平 ...

  6. AC日记——鬼谷子的钱袋 codevs 2998

    2998 鬼谷子的钱袋 2006年省队选拔赛湖南  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master    题目描述 Description 鬼谷子非常聪明,正 ...

  7. AC日记——舒适的路线 codevs 1001 (并查集+乱搞)

    1001 舒适的路线 2006年  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description Z小镇是 ...

  8. AC日记——逃跑的拉尔夫 codevs 1026 (搜索)

    1026 逃跑的拉尔夫  时间限制: 1 s    空间限制: 128000 KB    题目等级 : 黄金 Gold 题解       题目描述 Description   年轻的拉尔夫开玩笑地从一 ...

  9. AC日记——自然数和分解 codevs 2549

    自然数和分解 思路: 水题: 代码: #include <bits/stdc++.h> using namespace std; ][]; int main() { cin>> ...

随机推荐

  1. Flask学习笔记:数据库迁移操作flask-script+alembic/flask-migrate

    数据库迁移是将代码中模型类(即表)的修改同步到数据库中, flask-sqlalchemy的模型类一旦使用create_all()映射到数据库中后,对这个模型类的修改(例如添加了一个新的字段)就不会再 ...

  2. Python学习笔记(六)测试开发之接口开发

    Python的接口开发要使用到flask.Flask(__name__) 下面是一个简单的接口实例程序及访问效果: import flaskserver = flask.Flask(__name__) ...

  3. Linux常见的系統进程

    前言 在日常运维工作中,经常会看到一些奇怪的系统进程占用资源比较高.而且总是会听到业务线同学询问“xxx这个是啥进程啊?咋开启了这么多?” 而这些系统级的内核进程都是会用中括号括起来的,它们会执行一些 ...

  4. 算法图解之大O表示法

    什么是大O表示法 大O表示法可以告诉我们算法的快慢. 大O比较的是操作数,它指出了算法运行时间的增速. O(n) 括号里的是操作数. 举例 画一个16个格子的网格,下面分别列举几种不同的画法,并用大O ...

  5. 笔记-python-tutorial-8.errors and exceptions

    笔记-python-tutorial-8.errors and exceptions 1.      errors and exceptions 1.1.    syntax errors >& ...

  6. 剖析微软Hyper-V的最佳部署方式

    剖析微软Hyper-V的最佳部署方式 2014-04-24 10:53 布加迪编译 51CTO.com 字号:T | T 微软Hyper-V有两种不同的版本.既可以安装到Windows Server的 ...

  7. Python之利用socketserver实现并发

    socketserver这个模块是利用IO多路复用以及多线程实现并发的,可以让服务器同时建立多个链接 原理如图 我们这样更改服务器代码 import socketserver '''需要先写上一个类继 ...

  8. Map的常用方法keySet()、entrySet()

    Map是java中的接口,Map.Entry是Map的一个内部接口. Map提供了一些常用方法,如keySet().entrySet()等方法,keySet()方法返回值是Map中key值的集合:en ...

  9. diea

    http://name.vip.int ellig.top/name

  10. [国家集训队][bzoj 2152] 聪聪可可 [点分治]

    题面: http://www.lydsy.com/JudgeOnline/problem.php?id=2152 思路: 题目要求统计书上路径信息,想到树上分治算法 实际上这是一道点分治裸题,我就不瞎 ...