1588 [HNOI2002]营业额统计

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

题解


splay裸题,求一下前驱和后继搞一下就可以了。

此题在codevs上有一个点超时(不知道为什么),BZOJ上数据有问题,我也没有办法

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn=40000;
 6 int tr[maxn][2],fa[maxn],num[maxn],ans,n,x,t1,t2,size=0,rt;
 7 void rotate(int x,int &k){
 8     int y=fa[x],z=fa[y],l,r;
 9     if (tr[y][0]==x)l=0; else l=1; r=l^1;
10     if (y==k) k=x;
11     else {
12         if (tr[z][0]==y) tr[z][0]=x;else tr[z][1]=x;
13     }
14     fa[x]=z;fa[y]=x;fa[tr[x][r]]=y;
15     tr[y][l]=tr[x][r];tr[x][r]=y;
16 }
17
18 void splay(int x,int &k){
19     int y,z;
20     while (x!=k){
21         y=fa[x],z=fa[y];
22         if (y!=k){
23             if ((tr[z][0]==y)^(tr[y][0]==x)) rotate(x,k);
24             else rotate(y,k);
25         }
26         rotate(x,k);
27     }
28 }
29
30 void insert(int x,int &k,int last){
31     if (k==0){
32         size++;k=size;num[k]=x;fa[k]=last;splay(k,rt);return;
33     }
34     if (x>=num[k]) insert(x,tr[k][1],k); else insert(x,tr[k][0],k);
35 }
36
37 void large(int &k,int x){
38     if (k==0) return;
39     if (num[k]>=x){
40         t1=num[k];
41         large(tr[k][0],x);
42     }
43     else large(tr[k][1],x);
44 }
45
46 void small(int &k,int x){
47     if (k==0) return;
48     if (num[k]<=x){
49         t2=num[k];
50         small(tr[k][1],x);
51     }
52     else small(tr[k][0],x);
53 }
54
55 int main(){
56     scanf("%d",&n);
57     for (int i=0;i<n;i++){
58         if(scanf("%d",&x) == EOF) x = 0;//关于如何解决BZOJ上的错误
59         if (!rt) {ans+=x;insert(x,rt,0);}
60         else{
61         t1=t2=-1;
62         large(rt,x);small(rt,x);
63         if (t1==-1) ans+=(x-t2);
64         else if (t2==-1) ans+=(t1-x);
65         else ans+=min((x-t2),(t1-x));
66         insert(x,rt,0);
67     }
68     }
69     printf("%d",ans);
70 }
时间: 2024-10-27 04:26:11

1588 [HNOI2002]营业额统计的相关文章

BZOJ 1588: [HNOI2002]营业额统计

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14396  Solved: 5521[Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其

BZOJ 题目1588: [HNOI2002]营业额统计(Splay Tree 求前驱后继)

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 10828  Solved: 3771 [Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者

BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap

1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题.经济管理学上定义了一种最小波动值来衡量这

bzoj 1588: [HNOI2002]营业额统计 treap

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 13902  Solved: 5225[Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其

bzoj-1588 1588: [HNOI2002]营业额统计(BST)

题目链接: 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 13596  Solved: 5049[Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大

BZOJ 1588([HNOI2002]营业额统计-set)

1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 10371  Solved: 3597 [Submit][Status][Discuss] Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者

BZOJ 1588: [HNOI2002]营业额统计 双向链表

BZOJ 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 9619  Solved: 3287 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1588 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来

bzoj 1588 [HNOI2002] 营业额统计 链表和Splay

来自HNOI 2002营业额的统计一题,这题以前是用链表水过的,最近看见许多splay的题,赶紧张一下知识. 题目大意就是对于一个序列,输出每个元素与它之前元素的差的最小值的和.先说链表的方法吧. 大概就是sort一下,记录每个点的rank.然后链表一下,很好理解,复杂度nlogn,瓶颈在于排序. #include<cstdio> #include<algorithm> #include<iostream> using namespace std; struct nod

[BZOJ 1588][HNOI2002]营业额统计(Splay)

Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题.经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营