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

#include<cstdio>
#include<iostream>
#define inf 0x3f3f3f3f
using namespace std;
int n,root,sz,key[],pre[],ch[][];
void newnode(int &r,int f,int k)
{
r=++sz;
pre[r]=f;
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;
}
void insert(int k)
{
int r=root;
if(!r){
newnode(root,,k);
return;}
while(ch[r][key[r]<k])r=ch[r][key[r]<k];
newnode(ch[r][k>key[r]],r,k);
splay(ch[r][k>key[r]],);
}
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 get_pre(int x)
{
int tmp=ch[x][];
if(!tmp)return inf;
while(ch[tmp][])tmp=ch[tmp][];
return key[x]-key[tmp];
}
int main()
{
scanf("%d",&n);
int num,ans=;
for(int i=;i<=n;i++){
scanf("%d",&num);
insert(num);
if(i==)ans+=num;
else{
int a=get_next(root),b=get_pre(root);
ans+=min(a,b);}
}
printf("%d\n",ans);
return ;
}

更新fhq treap模板哦~~~

#include<cstdio>
#include<cstdlib>
#include<climits>
#include<iostream>
#define INF INT_MAX/3*2
using namespace std;
inline int Rin(){
int x=,c=getchar(),f=;
for(;c<||c>;c=getchar())
if(!(c^))f=-;
for(;c>&&c<;c=getchar())
x=(x<<)+(x<<)+c-;
return x*f;
}
struct Seg{
struct node{
node*ch[];
int v,s,r,size;
node(int v,node*_):v(v){s=size=;r=rand();ch[]=ch[]=_;}
void pu(){size=ch[]->size+ch[]->size+s;}
}*rt,*bf;
Seg(){
bf=new node(,);bf->r=INF;
bf->s=bf->size=;
bf->ch[]=bf->ch[]=bf;
rt=bf;
}
void rot(node*&o,int d){
node*k=o->ch[d];o->ch[d]=k->ch[d^];k->ch[d^]=o;
o->pu();k->pu();o=k;
}
void ins(node*&o,int x){
if(o==bf){o=new node(x,bf);return;}
if(o->v==x){o->s++;o->size++;return;}
ins(o->ch[x>o->v],x);
if(o->ch[x>o->v]->r<o->r)rot(o,x>o->v);
else o->pu();
}
int prev(node*o,int x){
if(o==bf)return -INF;
if(o->v==x&&o->s>)return o->v;
if(x<=o->v)return prev(o->ch[],x);
return max(o->v,prev(o->ch[],x));
}
int nxt(node*o,int x){
if(o==bf)return INF;
if(o->v==x&&o->s>)return o->v;
if(x>=o->v)return nxt(o->ch[],x);
return min(o->v,nxt(o->ch[],x));
}
}T;
int n,x,nxt,prev,ans;
int main(){
srand('z'+'t'+'k'+'s'+'q');
n=Rin();
for(int i=;i<=n;i++){
x=Rin();T.ins(T.rt,x);
if(!(i^)){ans=x;continue;}
prev=x-T.prev(T.rt,x),nxt=T.nxt(T.rt,x)-x;
ans+=min(prev,nxt);
}
printf("%d\n",ans);
return ;
}

NOI 2002 营业额统计 (splay or fhq treap)的更多相关文章

  1. 【数据结构】平衡树splay和fhq—treap

    1.BST二叉搜索树 顾名思义,它是一棵二叉树. 它满足一个性质:每一个节点的权值大于它的左儿子,小于它的右儿子. 当然不只上面那两种树的结构. 那么根据性质,可以得到该节点左子树里的所有值都比它小, ...

  2. 【BZOJ-1588】营业额统计 Splay

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

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

    [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4128  Solved: 1305 Description 营业额统计 ...

  4. NOIP 营业额统计 splay tree 纯模板

    2924: 营业额统计 Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 389       ...

  5. [HNOI 2002]营业额统计

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

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

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

  7. 1588: [HNOI2002]营业额统计 (splay tree)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 5783  Solved: 1859[Submit][Stat ...

  8. 洛谷P2234 [HNOI2002] 营业额统计 [splay]

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

  9. [HNOI2002]营业额统计 Splay tree入门题

    题目连接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec   ...

随机推荐

  1. [SharePoint] SharePoint 错误集 2

    1 Run command “New-SPConfigurationDatabase" Feature Description: error message popup after run ...

  2. 如何申请Autodesk ReCap 360 photo的云币(Cloud Credit)

    在之前的博客中我介绍过Autodesk的照片建模云服务—Autodesk ReCap 360 photo,通过Autodesk ReCap 360 photo,你可以非常方便的通过照片生成三维模型.如 ...

  3. 操作系统开发系列—10.内核HelloWorld ●

    a.我们先来体验一下在Linux下用汇编编程的感觉,见代码 [section .data] ; 数据在此 strHello db "Hello, world!", 0Ah STRL ...

  4. ios线程和GCD

    1.什么是进程? 进程是指在系统中正在运行的一个应用程序.比如同时打开QQ.Xcode,系统就会分别启动2个进程.截图 2.什么是线程? 1).一个进程要想执行任务,必须得有线程(每一个进程至少要有一 ...

  5. OC中的内存管理

    一. 基本原理 1. 什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需 ...

  6. 【Gson】2.2.4 StackOverflowError 异常

    正文 错误: 08-09 09:56:51.904: E/AndroidRuntime(16384): java.lang.StackOverflowError 08-09 09:56:51.904: ...

  7. Java 线程通信

    线程通信用来保证线程协调运行,一般在做线程同步的时候才需要考虑线程通信的问题. 1.传统的线程通信 通常利用Objeclt类提供的三个方法: wait() 导致当前线程等待,并释放该同步监视器的锁定, ...

  8. Mac OS 下的解压缩软件——The Unarchiver

    The Unarchiver 是 Mac 上最流行的解压软件,免费开源.操作方式与系统自带解压工具 Archive Utility.app 一样,双击自动解压.最爽的一点是把解压后原始文件直接仍进废纸 ...

  9. 适当使用enum做数据字典 ( .net c# winform csharp asp.net webform )

    在一些应用中,通常会用到很多由一些常量来进行描述的状态数据,比如性别(男.女),审核(未审核.已审核)等.在数据库中一般用数字形式来存储,比如0.1等. 不好的做法 经常看到一些应用(ps:最近又看到 ...

  10. C#程序猿电脑重装记录

    最近比较空了,闲的手痒,将自己的笔记本进行了重装,之前每次重装都没有记录,这次将本次重装过程记录下来,以便下次参考 1 首先不用说了WIN7旗舰版装好,驱动装好 2 开启Administrator用户 ...