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. Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信

    以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3360938.html 如新浪微博下面的标签切换功能,我以前也写过一篇博文(http:/ ...

  2. Android studio .gitignore 文件的内容

    # built application files *.apk *.ap_ # files for the dex VM *.dex # Intellij project files .idea/ . ...

  3. Android属性之build.prop生成过程分析

    Android的build.prop文件是在Android编译时刻收集的各种property(LCD density/语言/编译时间, etc.),编译完成之后,文件生成在out/target/pro ...

  4. MVC的优点及不足之处

    1. MVC的优点 (1) 可以为一个模型在运行时同时建立和使用多个视图.变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步. (2) 视图与控制器的可 ...

  5. IOS整体项目层级构建

    在创建IOS项目时,若有一个比较明确的层级架构,将对于今后代码的维护或者功能的扩展很有帮助:本文将通过一个实例来展现我对于层级的一些观点:里面有一些零碎的知识点可能无法全部介绍,到时提供源代码进行下载 ...

  6. SQLite3的基本使用

    |SQLite3简介  SQLite3只是一个轻型的嵌入式数据库引擎,占用资源非常低,处理速度比Mysql还快,专门用于移动设备上进行适量的数据存取,它只是一个文件,不需要服务器进程. 常用术语:表( ...

  7. C#中去掉表中重复的数据

    /// <summary> /// 去掉表中重复的数据  int /// </summary> /// <param name="SourceTable&quo ...

  8. Bug #19528825 "UNABLE TO PURGE A RECORD"

    概述: 在生产环境中,当开启insert buffer时(参数innodb_change_buffering=all),部分实例偶尔会出现“UNABLE TO PURGE A RECORD”错误.这个 ...

  9. Java AIO 异步IO应用实例

    项目地址:https://github.com/windwant/aio-test Server: package org.windwant.aio; import java.io.IOExcepti ...

  10. SQL Server 分隔字符串函数实现

    在SQL Server中有时候也会遇到字符串进行分隔的需求.平时工作中常常遇到这样的需求,例如:人员数据表和人员爱好数据表,一条人员记录可以多多人员爱好记录,而往往人员和人员爱好在界面展示层要一并提交 ...