treap树---营业额统计
描述
Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:
该天的最小波动值 = min{ |该天以前某天的营业额 - 该天的营业额 | }
当最小波动值越大时,就说明营业情况越不稳定。而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。第一天的最小波动值为第一天的营业额。
输入
测试数据多组,每组的第一行为正整数n(1 <= n <= 32767), 表示该公司从成立一直到现在的天数. 接下来的n行每行有一个整数Ai(Ai <= 1000000) , 表示第i天的营业额。处理到EOF为止。
输出
每组数据占一行,每行输出一个整数,每天最小波动值的和。结果小于2^31
样例输入
样例输出
提示
#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树---营业额统计的更多相关文章
- treap 1296 营业额统计
有一个点答案错误,求大神指教 #include<cstdio>#include<iostream>#include<cstdlib>#include<ctim ...
- 【Treap】bzoj1588-HNOI2002营业额统计
一.题目 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司 ...
- NOI 2002 营业额统计 (splay or fhq treap)
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap
1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...
- Splay树-Codevs 1296 营业额统计
Codevs 1296 营业额统计 题目描述 Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司 ...
- bzoj 1588: [HNOI2002]营业额统计 treap
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 13902 Solved: 5225[Submit][Sta ...
- bzoj1588 [HNOI2002]营业额统计(Treap)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 11485 Solved: 4062[Submit][Sta ...
- 2018.07.06 BZOJ 1588: HNOI2002营业额统计(非旋treap)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...
- 1588. [HNOI2002]营业额统计【平衡树-splay 或 线段树】
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
随机推荐
- [原创]Android自定义View之IndicatorView,显示当前tab页所处位置的View
概述 Android IndicatorView的灵感来源于SlidingTabView,虽然有句"不重复"造轮子在先,本着练手的目的,还是写了一个功能较为简单的类似view. 其 ...
- android多国语言文件夹文件汇总
android多国语言文件夹文件汇总如下: 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values-zh-rHK 英语(美国):values-e ...
- vim中多标签和多窗口的使用
用vim进行编辑的时候常常因为要编辑多个文件或者是编辑一个文件要参考其他文件而烦恼,这里介绍两种方法: 1.多标签 直接在编辑的时候输入: vim -p 要编辑的文件名 如vim -p * 就是编辑当 ...
- Angular 使用
tks: 使用: http://developer.51cto.com/art/201302/380661.htm http://www.infoq.com/cn/news/2013/02/angul ...
- MyEclipse自动生成hibernate实体类和配置文件攻略
步骤1:找到导航栏里面的window--showView然后输入db brower,打开数据库浏览窗口步骤2:在数据库浏览窗口里只有一个Myeclipse自带的数据库,该数据没有用,我们在空白的地方右 ...
- joomla allvideo 去掉embed share
文件位置plugins/content/jw_allvideos/jw_allvideos/includes/sources.php找到以下代码 jwplayer('avID_{SOURCEID}') ...
- nodejs初窥
1. node.js不是js应用,而是js运行平台.Node.js采用C++编写,是一个js的运行环境. 2. node.js采用事件驱动.异步编程,为网络服务而设计.Node.js的网络应用模块包括 ...
- 二十六、【开源框架】EFW框架Winform前端开发之Grid++Report报表、条形码、Excel导出、图表控件
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan ...
- mysql 启动错误-server PID file could not be found
[root@centos var]# service mysqld stop MySQL manager or server PID file could not be found! [F ...
- SNF开发平台WinForm之十二-发送手机短信功能调用-金笛-SNF快速开发平台3.3-Spring.Net.Framework
1.调用前组装参数 2.调用发送信息服务脚本 .调用前组装参数: BaseSendTaskEntity entity = new BaseSendTaskEntity(); entity.Mess ...