台州学院  2924

描述

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

该天的最小波动值 = min{ |该天以前某天的营业额 - 该天的营业额 | }

当最小波动值越大时,就说明营业情况越不稳定。而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。第一天的最小波动值为第一天的营业额。

输入

测试数据多组,每组的第一行为正整数n(1 <= n <= 32767), 表示该公司从成立一直到现在的天数. 接下来的n行每行有一个整数Ai(Ai <= 1000000) , 表示第i天的营业额。处理到EOF为止。

输出

每组数据占一行,每行输出一个整数,每天最小波动值的和。结果小于2^31

样例输入

样例输出

提示

5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12
 
题意 :求当前数与前面某个数差的绝对值的最小和;
思路:可使用treap树算法,利用treap树可以方便快速求得当前数之前出现的数的前继后驱,前继和后驱与当前数的差的绝对值小者即为所求,可用sum加上。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
using namespace std;
struct data
{
int l,r,v,rnd;
} tr[];
int size,root,ans1,ans2,f; void rturn(int &k)
{
int t=tr[k].l;
tr[k].l=tr[t].r;
tr[t].r=k;
k=t;
} void lturn(int &k)
{
int t=tr[k].r;
tr[k].r=tr[t].l;
tr[t].l=k;
k=t;
} void insert(int &k,int x)
{
if(k==)
{
size++;
k=size;
tr[k].v=x;
tr[k].rnd=rand();
return;
}
if(tr[k].v==x) f=;
else if(x>tr[k].v)
{
insert(tr[k].r,x);
if(tr[tr[k].r].rnd<tr[k].rnd) lturn(k);
}
else
{
insert(tr[k].l,x);
if(tr[tr[k].l].rnd<tr[k].rnd) rturn(k);
}
} void query_pro(int k,int x)
{
if(k==) return;
if(tr[k].v<x)
{
ans1=tr[k].v;
query_pro(tr[k].r,x);
}
else query_pro(tr[k].l,x);
} void query_sub(int k,int x)
{
if(k==) return;
if(tr[k].v>x)
{
ans2=tr[k].v;
query_sub(tr[k].l,x);
}
else query_sub(tr[k].r,x);
} int main()
{
int n;
int x;
while(scanf("%d",&n)!=EOF)
{
root=;
size=;
for(int i=;i<;i++)
{
tr[i].l=;
tr[i].r=;
tr[i].v=;
}
scanf("%d",&x);
insert(root,x);
int sum=x;
for(int i=;i<n;i++)
{
f=;
ans1=-;
ans2=;
if(scanf("%d",&x)==EOF) x=;
insert(root,x);
if(f) continue;
query_pro(root,x);
query_sub(root,x);
sum+=min(x-ans1,ans2-x);
}
printf("%d\n",sum);
}
return ;
}

方法二:(Splay树)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define N 100005
#define inf 1<<29
using namespace std;
int pre[N],key[N],ch[N][],root,tot;
int n; void NewNode(int &r,int father,int k)
{
r=++tot;
pre[r]=father;
key[r]=k;
ch[r][]=ch[r][]=;
} void Rotate(int x,int kind)
{
int y=pre[x];
ch[y][!kind]=ch[x][kind];
pre[ch[x][kind]]=y;
if(pre[y])
{
ch[pre[y]][ch[pre[y]][]==y]=x;
}
pre[x]=pre[y];
ch[x][kind]=y;
pre[y]=x;
} void Splay(int r,int goal)
{
while(pre[r]!=goal)
{
if(pre[pre[r]]==goal)
Rotate(r,ch[pre[r]][]==r);
else
{
int y=pre[r];
int kind=ch[pre[y]][]==y;
if(ch[y][kind]==r)
{
Rotate(r,!kind);
Rotate(r,kind);
}
else
{
Rotate(y,kind);
Rotate(r,kind);
}
}
}
if(goal==) root=r;
} int Insert(int k)
{
int r=root;
while(ch[r][key[r]<k])
{
if(key[r]==k)
{
Splay(r,);
return ;
}
r=ch[r][k>key[r]];
}
NewNode(ch[r][k>key[r]],r,k);
Splay(ch[r][k>key[r]],);
return ;
} int get_pre(int x)
{
int tmp=ch[x][];
if(tmp==) return inf;
while(ch[tmp][])
tmp=ch[tmp][];
return key[x]-key[tmp];
} int get_next(int x)
{
int tmp=ch[x][];
if(tmp==) return inf;
while(ch[tmp][])
tmp=ch[tmp][];
return key[tmp]-key[x];
} int main()
{
while(scanf("%d",&n)!=EOF)
{
root=tot=;
int ans=;
for(int i=;i<=n;i++)
{
int num;
if(scanf("%d",&num)==EOF) num=;
if(i==)
{
ans+=num;
NewNode(root,,num);
continue;
}
if(Insert(num)==) continue;
int a=get_pre(root);
int b=get_next(root);
ans+=min(a,b);
}
printf("%d\n",ans);
}
return ;
}

treap树---营业额统计的更多相关文章

  1. treap 1296 营业额统计

    有一个点答案错误,求大神指教 #include<cstdio>#include<iostream>#include<cstdlib>#include<ctim ...

  2. 【Treap】bzoj1588-HNOI2002营业额统计

    一.题目 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司 ...

  3. NOI 2002 营业额统计 (splay or fhq treap)

    Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...

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

    1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...

  5. Splay树-Codevs 1296 营业额统计

    Codevs 1296 营业额统计 题目描述 Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司 ...

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

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 13902  Solved: 5225[Submit][Sta ...

  7. bzoj1588 [HNOI2002]营业额统计(Treap)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 11485  Solved: 4062[Submit][Sta ...

  8. 2018.07.06 BZOJ 1588: HNOI2002营业额统计(非旋treap)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...

  9. 1588. [HNOI2002]营业额统计【平衡树-splay 或 线段树】

    Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...

随机推荐

  1. Customer IEnuramble Extension

    public static class IEnurambleExtension { public static IEnumerable<TSource> DistinctBy<TSo ...

  2. 申请Payoneer美国万事达信用卡,可获得一个美国虚拟银行账户,立即注册可得25美元

    申请Payoneer美国万事达信用卡,可获得一个美国虚拟银行账户,可以在国内任意一个支持万事达的ATM.POS机上取现和刷卡消费.Payoneer可以网上购物,购买国外的产品,对我们有一个好处就是利用 ...

  3. php连接oracle数据库的方法

    1.在php.ini中打开extension=php_oci8扩展,重启服务. 2.将php/ext目录下的php_oci8.dll文件拷贝到system32目录下 3.安装 Oracle9i客户端精 ...

  4. Android实现自适应正方形GridView(陌陌引导页面效果)

    1.http://blog.chengyunfeng.com/?p=465 2.备注,慢慢研究

  5. OceanBase RPC机制简要说明

    http://note.youdao.com/share/?id=d2163a7ba8ec1ec58e64683a961c5121&type=note RPC是OB一个比较重要的各个组件间进行 ...

  6. C# vs MySql

    MySqlHelper类 /// <summary> ///MySql操作类 /// </summary> public abstract class MySqlHelper ...

  7. c2ph

    http://bolenot.ru/library/cmd/blcmdl1_c2ph.htm?-c2ph---Linux%E5%91%BD%E4%BB%A4--UNIX%E5%91%BD%E4%BB% ...

  8. Red Hat Enterprise Linux 各版本详细说明

    https://access.redhat.com/articles/3078#RHEL7 Red Hat Enterprise Linux Release Dates Updated Novembe ...

  9. xfire框架内部基本结构解析

    1 概述 xfire是webservice的一个实现框架,是apache旗下CXF的前身,是一个比较被广泛使用的webservice框架,网上有很多关于如何使用xfire或cxf的hello worl ...

  10. Android View自动生成插件

    在ButterKnife这样强大的注入库出来之后,使用注入进行UI开发已经非常普遍.但考虑到效率.学习成本等问题,findViewById方式仍然是不错的选择. 但是当页面UI变得复杂后,我们从Lay ...