洛谷P2234 [HNOI2002]营业额统计(01Tire树)
时间:2022-05-08
本文章向大家介绍洛谷P2234 [HNOI2002]营业额统计(01Tire树),主要内容包括题目描述、输入输出格式、输入输出样例、说明、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
题目描述
Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。
Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:
当最小波动值越大时,就说明营业情况越不稳定。
而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。
第一天的最小波动值为第一天的营业额。
该天的最小波动值=min{|该天以前某一天的营业额-该天营业额|}。
输入输出格式
输入格式:
输入由文件’turnover.in’读入。
第一行为正整数n(n<=32767) ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数ai(|ai|<=1000000) ,表示第i天公司的营业额,可能存在负数。
输出格式:
输入输出样例
输入样例#1:
6
5
1
2
5
4
6
输出样例#1:
12
说明
结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12
来一发01Trie树
表示懒得写查找前驱和后继的函数了,
就用kth(查找排名为x的数)和rak(查找x的排名)偷了个懒
找前驱的时候就是kth( rak(x) )
后继是kth( rak(x) +1) (注意这里的前驱后继不是严格的,所以允许重复)
时间复杂度可能有点高,不过还是能水过去的
1 #include<cstdio>
2 #include<algorithm>
3 #include<cmath>
4 #include<iostream>
5 #include<cstdlib>
6 #include<cstring>
7 using namespace std;
8 const int MAXN=1e6+10,INF=1e7;
9 inline char nc()
10 {
11 static char buf[MAXN],*p1=buf,*p2=buf;
12 return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1++;
13 }
14 inline int read()
15 {
16 char c=nc();int x=0,f=1;
17 while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}
18 while(c>='0'&&c<='9'){x=x*10+c-'0';c=nc();}
19 return x*f;
20 }
21 int ch[MAXN][2],num[MAXN],tot=2,root=1;
22 inline void insert(int x)
23 {
24 x+=INF;
25 for(int i=31,now=root,t; ~i; i--)
26 {
27 if( !(ch[now][ t=x>>i &1 ]) ) ch[now][t]=++tot;
28 num[ now=ch[now][t] ]+=1;
29 }
30 }
31 inline int rak(int x)
32 {
33 x+=INF;
34 int ans=0;
35 for(int i=31,now=root,t; ~i ; i--)
36 {
37 if( (t=x>>i &1) )
38 ans+=num[ ch[now][0] ];
39 now=ch[now][t];
40 }
41 return ans;
42 }
43 inline int kth(int x)
44 {
45 int ans=0;
46 for(int i=31,now=root; ~i ; i--)
47 {
48 if( x>num[ ch[now][0] ] ) ans|=1<<i,x-=num[ ch[now][0] ],now=ch[now][1];
49 else now=ch[now][0];
50 }
51 return ans-INF;
52 }
53 int main()
54 {
55 #ifdef WIN32
56 freopen("a.in","r",stdin);
57 #else
58 #endif
59 int n=read(),ans=read();n=n-1;
60 insert(ans);
61 while(n--)
62 {
63 int x=read();
64 int pre=kth( rak(x) );
65 int lat=kth( rak(x) +1);
66 ans+=min( abs(pre-x) ,abs(lat-x) );
67 insert(x);
68 }
69 printf("%d",ans);
70 }
- 关于Go语言中数组的参数传递问题
- 【深度学习系列】用PaddlePaddle进行车牌识别(一)
- GO语言-new()分配与构造和初始化结构
- Java基础-day05-超市收银系统案例题
- mongodb11天之屠龙宝刀(五)lbs地理位置检索:存储经纬度以及查询
- 【深度学习系列】关于PaddlePaddle的一些避“坑”技巧
- 【深度学习系列】PaddlePaddle可视化之VisualDL
- Java基础-day04-代码题
- 【深度学习系列】CNN模型的可视化
- mongodb11天之屠龙宝刀(六)mapreduce:mongodb中mapreduce原理与操作案例
- 真实场景的虚拟视点合成(View Synthsis)详解
- mongodb11天之屠龙宝刀(七)functions: mongodb 执行 functions入门案例
- 真实场景的双目立体匹配(Stereo Matching)获取深度图详解
- mongodb11天之屠龙宝刀(八)聚合函数与管道:sql与mongodb聚合函数对比
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 谈谈Gaussian软件中的guess=mix
- 用ORCA做DLPNO-CCSD(T)计算
- Fortran调用C函数
- 在Python中创建命令行界面的最佳方式
- Diels-Alder反应的区域选择性分析
- 传说中的画图神器Plotnine,Python中的ggplot2
- 用ORCA做结构优化及轨迹查看
- 前端兼容之痛
- 离线安装PySCF程序(1.5及更高版本)
- Python Debug(调试)的终极指南
- Linux下做计算常用的别名alias推荐
- 离线安装支持Intel MKL的R-3.6
- Dalton使用——磷光及其相关过程
- 【赵渝强老师】Flink的Watermark机制(基于Flink 1.11.0实现)
- 在Windows CMD里“使用”常见Linux命令