洛谷P2234 [HNOI2002]营业额统计(01Tire树)
2018-06-17 21:31:36来源:未知 阅读 ()
题目描述
Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。
Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:
当最小波动值越大时,就说明营业情况越不稳定。
而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。
第一天的最小波动值为第一天的营业额。
该天的最小波动值=min{|该天以前某一天的营业额-该天营业额|}。
输入输出格式
输入格式:
输入由文件’turnover.in’读入。
第一行为正整数n(n<=32767) ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数ai(|ai|<=1000000) ,表示第i天公司的营业额,可能存在负数。
输出格式:
输入输出样例
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
来一发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 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:洛谷P1734 最大约数和
下一篇:leetcode习题笔记
- 洛谷P1164->小A点菜 2020-05-18
- 洛谷P1907口算练习题 2020-03-24
- 结题报告--P5551洛谷--Chino的树学 2020-03-13
- 结题报告--洛谷P3915 2020-03-13
- 洛谷P1034 矩形覆盖 2020-03-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash