AC日记——营业额统计 1296 codevs
Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。
Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:
该天的最小波动值 = min{|该天以前某一天的营业额-该天营业额|}
当最小波动值越大时,就说明营业情况越不稳定。
而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。
第一天的最小波动值为第一天的营业额。
第一行为正整数n(n<=32767),表示该公司从成立一直到现在的天数,接下来的n行每行有一个正整数ai(ai<=1000000),表示第i天公司的营业额。
输出文件仅有一个正整数,即每天最小波动值之和,小于231
6
5
1
2
5
4
6
12
结果说明: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的更多相关文章
- AC日记——营业额统计 codevs 1296 (splay版)
营业额统计 思路: 每次,插入一个点: 然后找前驱后继: 来,上代码: #include <cmath> #include <cstdio> #include <iost ...
- AC日记——接龙游戏 codevs 1051
1051 接龙游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给出了N个单词,已经按长度排好了序.如果 ...
- AC日记——数字统计 openjudge 1.5 41
41:数字统计 总时间限制: 1000ms 内存限制: 65536kB 描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数. 比如给定范围[2, 22],数字2在数2中出现了1次, ...
- AC日记——最优贸易 codevs 1173
题目描述 Description [问题描述]C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路 ...
- AC日记——地鼠游戏 codevs 1052
1052 地鼠游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 王钢是一名学习成绩优异的学生,在平 ...
- AC日记——鬼谷子的钱袋 codevs 2998
2998 鬼谷子的钱袋 2006年省队选拔赛湖南 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 鬼谷子非常聪明,正 ...
- AC日记——舒适的路线 codevs 1001 (并查集+乱搞)
1001 舒适的路线 2006年 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description Z小镇是 ...
- AC日记——逃跑的拉尔夫 codevs 1026 (搜索)
1026 逃跑的拉尔夫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 年轻的拉尔夫开玩笑地从一 ...
- AC日记——自然数和分解 codevs 2549
自然数和分解 思路: 水题: 代码: #include <bits/stdc++.h> using namespace std; ][]; int main() { cin>> ...
随机推荐
- Python9-MySQL-MySQL存储过程-视图-触发器-函数-day45
视图:某个查询语句设置别名,日后方便使用 CREATE VIEW v1 as SELECT * FROM student WHERE sid >10 -创建: create view 视图名称 ...
- python模块汇总练习
模块练习 1.random模块 # print(random.random()) # print(random.randint(1,3)) #模拟随机验证码 def make_code(n=5): r ...
- [BZOJ1208]宠物收养所(Splay)
Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...
- 2、大O表示法
一.大O表示法 大O表示法不是一种算法.它是用来表示一个算法解决问题的速度的快慢.一般我们描述一件事情完成的快慢是用时间描述的,比如说我完成一道计算题用了多少分钟.但算法的运算是很难用准确的时间来描述 ...
- java以正确的方式停止线程
java线程停止可以说是非常有讲究的,看起来非常简单,但是也要做好一些防范措施,一般停止一个线程可以使用Thread.stop();来实现,但是最好不要用,因为他是不安全的. 大多数停止线程使用Thr ...
- 13、jQueryMobile知识总结
1.jQueryMobile与jQuery的区别 jQueryMobile是一个为触控优化的框架,用于创建移动Web应用程序:构建于jQuery之上,适用于流行的智能手机和平板 基于jQuery的手机 ...
- java自动化测试开发环境搭建(更新至2018年10月8日 11:42:15)
1.安装JDK的1.8版本 官网下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151 ...
- 集训队日常训练20181117 DIV2
大佬们一顿操作猛如虎,拼命AC强啊 4262: 区间异或 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal ...
- scp -v 查看具体的过程
前几天跟同事讨论scp 多个文件和 scp多个文件夹的压缩包那个快. 老大说,压缩包快,压缩包传输可以避免每个文件的重建连接,不过文件系统的遍历.目录创建.检验会有一些开销. 他建议我scp -v看下 ...
- 团队Alpha版本冲刺(三)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最 ...