[BZOJ 1588] [HNOI 2002] 营业额统计

1588: [HNOI2002]营业额统计

Time Limit: 5 SecMemory Limit: 162 MB

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

此题数据有问题,详见讨论版http://www.lydsy.com/JudgeOnline/wttl/wttl.php?pid=1588

【题解】

用平衡树来维护插入等操作即可。

平衡树第二题 AC

事实证明,zig,zag分开来写会更快=-=

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=40010;
 4 int fa[N],ch[N][2],root,k[N],ind=1;
 5 void zig(int x) {
 6     int y=fa[x],z=fa[y];
 7     fa[y]=x;
 8     fa[x]=z;
 9     ch[y][0]=ch[x][1],fa[ch[x][1]]=y,ch[x][1]=y;
10     if (y==ch[z][0]) ch[z][0]=x;
11     else ch[z][1]=x;
12     //size[y]=size[ch[y][0]]+size[ch[y][1]]+1;
13 }
14 void zag(int x) {
15     int y=fa[x],z=fa[y];
16     fa[y]=x,fa[x]=z;
17     ch[y][1]=ch[x][0],fa[ch[x][0]]=y,ch[x][0]=y;
18     if (y==ch[z][0]) ch[z][0]=x;
19     else ch[z][1]=x;
20     //size[y]=size[ch[y][0]]+size[ch[y][1]]+1;
21 }
22 void splay(int x,int s) {
23     while (fa[x]!=s) {
24         int y=fa[x],z=fa[y];
25         if (z==s) {
26             if (x==ch[y][0]) zig(x);
27             else zag(x);
28             break;
29         }
30         if (y==ch[z][0]) {
31             if (x==ch[y][0]) zig(y),zig(x);
32             else zag(x),zig(x);
33         }
34         else {
35             if (x==ch[y][1]) zag(y),zag(x);
36             else zig(x),zag(x);
37         }
38     }
39     //size[x]=size[ch[x][0]]+size[ch[x][1]]+1;
40     if (s==0) root=x;
41 }
42 inline void newnode(int &x,int fax,int key) {
43     x=++ind;
44     ch[x][0]=ch[x][1]=0;
45     fa[x]=fax;
46     k[x]=key;
47 }
48 inline int search(int w) {
49     int p,x=root;
50     while(x) {
51         p=x;
52         if(k[x]>w) x=ch[x][0];
53         else x=ch[x][1];
54     }
55     return p;
56 }
57 inline void ins(int w){
58     if (root==0) {
59         newnode(root,0,w);
60         return ;
61     }
62     int i=search(w);
63     if(w<k[i]) newnode(ch[i][0],i,w);
64     else newnode(ch[i][1],i,w);
65     splay(ind,0);
66 }
67 inline int pre(int x) {
68     int tmp=ch[x][0];
69     while(ch[tmp][1]) tmp=ch[tmp][1];
70     return k[tmp];
71 }
72 inline int suc(int x) {
73     int tmp=ch[x][1];
74     while(ch[tmp][0]) tmp=ch[tmp][0];
75     return k[tmp];
76 }
77 int main() {
78     int n,t,ans=0;
79     scanf("%d%d",&n,&t);
80     root=1;k[root]=t;
81     ch[root][0]=ch[root][1]=0;
82     fa[root]=0;//printf("hhh");
83     ans=t;ins(2100000);
84     ins(-2100000);
85     for (int i=2;i<=n;++i) {
86         if(scanf("%d",&t)==EOF) t=0;
87         ins(t);
88         int a=pre(root),b=suc(root);
89         ans+=min(t-a,b-t);
90     }
91     printf("%d\n",ans);
92     return 0;
93 }

时间: 2024-10-07 06:43:27

[BZOJ 1588] [HNOI 2002] 营业额统计的相关文章

HNOI 2002 营业额统计

简单题,splay 题意: 按顺序给出一些数,找出距离当前数最近的数的差,将这些差求和即可. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cstdlib> #include <cmath> #include <utility> #include <vector> #include

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

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

BZOJ 1588 营业额统计 Splay

主要操作为Splay中插入节点,查找前驱和后继节点. 1: #include <cstdio> 2: #include <iostream> 3: #include <cmath> 4: using namespace std; 5: #define MaxL 100005 6: #define INF 0x7ffffff 7: #define keyTree sp[sp[root].child[1]].child[0] 8:   9: struct SplayTree

【HNOI 2002 】营业额统计

P1287 - [HNOI 2002 ]营业额统计 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]营业额统计

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

BZOJ 1588 营业额统计

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拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题.经济管理学上定义了一种最小波动值来衡量这