【bzoj1588】:[HNOI2002]营业额统计

1588: [HNOI2002]营业额统计

             Time Limit: 5 Sec??Memory Limit: 162 MB

Description

营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。 ? 输入输出要求

Input

第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i
天公司的营业额。
天数n<=32767,
每天的营业额ai <= 1,000,000。
最后结果T<=2^31

Output

输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。

Sample Input

6
5
1
2
5
4
6

Sample Output

12

Solution

平衡树裸体....
可以用链表写,不过像我这种没有什么追求的人就打了个平衡树走人
顺便安利一波同组大佬写的链表

平衡树:

#include <bits/stdc++.h>
using namespace std;
#define inf 2147483647
struct node{
????node *son[2],*father;
????int val,size,count;
????node(int v=0,node *f=NULL){
????????val=v,father=f;son[1]=son[0]=NULL;
????????size=count=1;
????}
}*root;
?
inline bool son(node *f,node *t){return f->son[1]==t;}
inline int size(node *t){return t==NULL?0:t->size+t->count;}
inline void update(node *t){t->size=size(t->son[0])+size(t->son[1])+t->count;}
?
inline void rotate(node *t){
??????node *f=t->father,*g=f->father;
??????bool a=son(f,t),b=!a;
??????f->son[a]=t->son[b];
??????if(t->son[b]!=NULL)
????????t->son[b]->father=f;
??????f->father=t;
??????t->father=g;
??????t->son[b]=f;
??????if(g!=NULL)
????????g->son[son(g,f)]=t;
??????else root=t;
??????update(f);update(t);
}
?
inline void splay(node *t,node *p){
????while(t->father!=p){
????????node *f=t->father,*g=f->father;
????????if(g==p)rotate(t);
????????else if(son(f,t)^son(g,f))
????????????rotate(t),rotate(t);
????????else rotate(f),rotate(t);
????}
}
?
inline void insert(int val){
????if(root==NULL){
????????root=new node(val);
????????return;
????}
????for(node *t=root;t!=NULL;t=t->son[val>t->val]){
????????t->size++;
????????if(val==t->val){
????????????t->count++;splay(t,NULL);
????????????return;
????????}
????????if(t->son[val>t->val]==NULL){
????????????bool a=val>t->val,b=!a;
????????????t->son[a]=new node(val,t);
????????????splay(t->son[a],NULL);
????????????return;
????????}
????}
}
?
inline int lower(int val){
????int rtn=-inf;
????for(node *t=root;t!=NULL;){
????????if(val>=t->val){
????????????rtn=t->val;
????????????t=t->son[1];
????????}else t=t->son[0];
????}return rtn;
}
?
inline int upper(int val){
????int rtn=-inf;
????for(node *t=root;t!=NULL;){
????????if(val<t->val){
????????????rtn=t->val;
????????????t=t->son[0];
????????}else t=t->son[1];
????}return rtn;
}
?
int main(){
????int n;scanf("%d",&n);
????int ans;scanf("%d",&ans);insert(ans);
????insert(inf);
????for(int i=2;i<=n;i++){
????????int x,tmp=inf;scanf("%d",&x);
????????int lowr=lower(x);
????????int uppr=upper(x);
????????if(lowr!=-inf)tmp=min(tmp,abs(lowr-x));
????????if(uppr!=-inf)tmp=min(tmp,abs(uppr-x));
????????ans+=tmp;
????????insert(x);
????}
????printf("%d",ans);
????return 0;
} 

链表:

#include <bits/stdc++.h>
using namespace std;

const int maxn = 5e4 + 10;
struct node {
    int l, r, v;
}T[maxn];
int pos[maxn];
bool cmp(int x, int y) {
    return T[x].v < T[y].v;
}
void erase(int p) {
    T[T[p].l].r = T[p].r;
    T[T[p].r].l = T[p].l;
}
int ans;
int main() {
    int n; scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &T[i].v), pos[i] = i;
    sort(pos + 1, pos + 1 + n, cmp);
    for (int i = 2; i <= n; i++) {
        T[pos[i - 1]].r = pos[i];
        T[pos[i]].l = pos[i - 1];
    }
    for (int i = n; i > 1; i--) {
        int now = 1e9;
        if (T[i].l) now = min(now, abs(T[i].v - T[T[i].l].v));
        if (T[i].r) now = min(now, abs(T[i].v - T[T[i].r].v));
        erase(i);
        ans += now;
    }
    ans += T[1].v;
    return 0 * printf("%d", ans);
}
时间: 2024-10-05 00:33:59

【bzoj1588】:[HNOI2002]营业额统计的相关文章

BZOJ1588: [HNOI2002]营业额统计[BST]

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

BZOJ1588 HNOI2002 营业额统计 [Splay入门题]

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

BZOJ1588 [HNOI2002]营业额统计 splay模板

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

[BZOJ1588][HNOI2002]营业额统计 无旋Treap

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

【链表】BZOJ1588: [HNOI2002]营业额统计

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

BZOJ1588: [HNOI2002]营业额统计(正解:平衡树,我的歪解:暴力)

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

BZOJ1588 [HNOI2002] 营业额统计

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 又是一道Treap模版题……总做模版题不好…… 另外牢记:BZOJ上用srand(time(0))会RE! 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <ctime> 6 #defin

bzoj1588: [HNOI2002]营业额统计 splay瞎写

最近各种瞎写数论题,感觉需要回顾一下数据结构 写一发splay冷静一下(手速过慢,以后要多练练) 用splay是最直接的方法,但我感觉离散一波应该可以做出来(没仔细想过) 现在没有很追求代码优美,感觉得先打的对打的快O(∩_∩)O 1 #include <bits/stdc++.h> 2 #define INF 1000000000 3 using namespace std; 4 int root,N,n,x; 5 int fa[100005],c[100005][2],a[100005];

bzoj1588 [HNOI2002]营业额统计 (平衡树)

平衡树裸题 只需要求前驱后驱 treap写法 const mm=1<<30; maxnumber=500000; maxn=500000; var left,right,fix,key:array[0..maxn]of longint; t,n,ans,i,j,k,l,tot:longint; function min(x,y:longint):longint; begin if x<y then exit(x); exit(y); end; function max(x,y:longi

bzoj1588: [HNOI2002]营业额统计 treap

原来treap这么简单...比splay简单多了.... #include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1000100; const int INF=1e9+10; int n,a; struct Node { Nod