1588: [HNOI2002]营业额统计

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 12171  Solved: 4352

Description

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

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

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

SOLUTION:

可以用TREAP,在读入当天的营业额x后,先求出x的前驱(前驱定义为小于x,且最大的数)和x的后继(后继定义为大于x,且最小的数),

后分别与X相减求出较小的绝对值。最后插入X。

另,数据有问题,在读入时要:if (scanf ("%d", &x) == EOF) x = 0;

AC代码:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
#include <vector>
using namespace std; int size=; struct data
{
int l,size,r,w,rnd,val;
} tr[];
int n;
int root; int _abs(int x)
{
if (x>) return x;
return (-x);
} int _min(int a,int b)
{
if (a<b) return a;
return b;
} void update(int &k)
{
tr[k].size=tr[tr[k].l ].size+tr[tr[k].r ].size+ tr[k].w;
} void lturn(int &k)
{
int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;
tr[t].size=tr[k].size;update(k);k=t;
} void rturn(int &k)
{
int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;
tr[t].size=tr[k].size;update(k);k=t;
} void insert(int &k,int x)
{
if (k==)
{
size++;k=size;
tr[k].size=tr[k].w=;
tr[k].rnd=rand();
tr[k].val=x;
return;
}
tr[k].size++;
if (tr[k].val==x)
{
tr[k].w++;
}
else
{
if (x>tr[k].val)
{
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);
}
}
} int ans=; void query_pro(int k,int x)
{
if (k==) return ;
if (tr[k].val==x)
{
ans=x;
return ;
}
if (tr[k].val<x)
{
ans=tr[k].val;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].val==x) {
ans=x;
return;
}
if (tr[k].val>x)
{
ans=tr[k].val;query_sub(tr[k].l,x);
}
else
query_sub(tr[k].r,x);
} int main()
{ scanf("%d",&n);
int x;
long long sum=;
for (int i=;i<=n;i++)
{
if (scanf ("%d", &x) == EOF) x = ;
if (i!=)
{
ans=-;
query_pro(root,x);
int flow_pro=_abs(x-ans);
ans=-;
query_sub(root,x);
int flow_sub=_abs(x-ans);
sum+=(long long)_min(flow_pro,flow_sub);
}
else sum+=(long long)x;
insert(root,x);
} printf("%d",(int)sum); return ;
}

更多解法:http://hzwer.com/1276.html

TREAP模板:[from baidu qaq]

http://baike.baidu.com/link?url=L0NLqoR1SDZsk7iX5ZJZb0yt6qukm7a18e5IxBdPFUVaueBoLAHv5m8HmnPzUCXzHO764KOdv_xCU7yfvH_vea

支持以下操作
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)
//by hzwer
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
struct data{
int l,r,v,size,rnd,w;
}tr[];
int n,size,root,ans;
void update(int k)//更新结点信息
{
tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w;
}
void rturn(int &k)
{
int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;
tr[t].size=tr[k].size;update(k);k=t;
}
void lturn(int &k)
{
int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;
tr[t].size=tr[k].size;update(k);k=t;
}
void insert(int &k,int x)
{
if(k==)
{
size++;k=size;
tr[k].size=tr[k].w=;tr[k].v=x;tr[k].rnd=rand();
return;
}
tr[k].size++;
if(tr[k].v==x)tr[k].w++;
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 del(int &k,int x)
{
if(k==)return;
if(tr[k].v==x)
{
if(tr[k].w>)
{
tr[k].w--;tr[k].size--;return;
}
if(tr[k].l*tr[k].r==)k=tr[k].l+tr[k].r;
else if(tr[tr[k].l].rnd<tr[tr[k].r].rnd)
rturn(k),del(k,x);
else lturn(k),del(k,x);
}
else if(x>tr[k].v)
tr[k].size--,del(tr[k].r,x);
else tr[k].size--,del(tr[k].l,x);
}
int query_rank(int k,int x)
{
if(k==)return ;
if(tr[k].v==x)return tr[tr[k].l].size+;
else if(x>tr[k].v)
return tr[tr[k].l].size+tr[k].w+query_rank(tr[k].r,x);
else return query_rank(tr[k].l,x);
}
int query_num(int k,int x)
{
if(k==)return ;
if(x<=tr[tr[k].l].size)
return query_num(tr[k].l,x);
else if(x>tr[tr[k].l].size+tr[k].w)
return query_num(tr[k].r,x-tr[tr[k].l].size-tr[k].w);
else return tr[k].v;
}
void query_pro(int k,int x)
{
if(k==)return;
if(tr[k].v<x)
{
ans=k;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)
{
ans=k;query_sub(tr[k].l,x);
}
else query_sub(tr[k].r,x);
}
int main()
{
scanf("%d",&n);
int opt,x;
for(int i=;i<=n;i++)
{
scanf("%d%d",&opt,&x);
switch(opt)
{
case :insert(root,x);break;
case :del(root,x);break;
case :printf("%d\n",query_rank(root,x));break;
case :printf("%d\n",query_num(root,x));break;
case :ans=;query_pro(root,x);printf("%d\n",tr[ans].v);break;
case :ans=;query_sub(root,x);printf("%d\n",tr[ans].v);break;
}
}
return ;
}

BZOJ 1588: Treap 模板的更多相关文章

  1. bzoj 1588 splay模板题

    用晚自习学了一下splay模板,没想象中那么难,主要是左旋和右旋可以简化到一个函数里边,减少代码长度... #include<iostream> #include<cstdio> ...

  2. BZOJ 1588 平衡树 模板题

    Treap: //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; int si ...

  3. BZOJ 1588 (treap)

    题面 传送门 分析 语文题,主要是如何理解最小波动值 设当前天的营业额为x,则最小波动值为min(x-最大的<=x的数,最小的>=x的数-x) 然后用Treap维护序列就可以了 时间复杂度 ...

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

    BZOJ 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 9619  Solved: 3287 题目连接 ht ...

  5. [luogu3369]普通平衡树(treap模板)

    解题关键:treap模板保存. #include<cstdio> #include<cstring> #include<algorithm> #include< ...

  6. 洛谷 2234 BZOJ 1588 HNOI2002 营业额统计

    [题解] treap模板题,直接用Treap维护前驱.后继,每次找到更接近当前val的加上就好了. #include<cstdio> #include<algorithm> # ...

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

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

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

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

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

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

随机推荐

  1. [转]100个经典C语言程序(益智类问题)

    目录: 1.绘制余弦曲线 2.绘制余弦曲线和直线 3.绘制圆 4.歌星大奖赛 5.求最大数 6.高次方数的尾数 8.借书方案知多少 9.杨辉三角形 10.数制转换 11.打鱼还是晒网 12.抓交通肇事 ...

  2. 信息安全实验一:buffer-overflow

    title: buffer-overflow date: 2016-01-10 14:17:17 categories: information-security tags: buffer-overf ...

  3. Solr Update备注

    参考资料: http://wiki.apache.org/solr/ExtractingRequestHandler#Sending_documents_to_Solr /update 标准的upda ...

  4. 学习微信小程序之css17clearfix原理

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 怎么把QQ我的收藏表情图片转移到另一台电脑上

    把收藏的QQ表情从一台电脑转移到另一台电脑的操作步骤如下:    1.在有表情的电脑登陆QQ,随便打开一个聊天窗口,点击[表情],选择[表情设置],点击[导入导出表情包],选择[导出全部表情包]:   ...

  6. 监视系统3389的VBS脚本

    Title: 监视系统3389的VBS脚本 --2010-10-27 19:56 从网上找的,不知道是不是NP写的那个 ---------------------------------------- ...

  7. python的工作记录A

    马上进入工作自动化: [root@localhost ~]# cat svn_bbs.py import os,sys,commands,subprocess import re,time svnUr ...

  8. QML控件类关系图

    花了点时间整理了下QML控件之间的关系图和QML控件和C++类的对应关系,基于Qt5.6版本 其他版本可能会有差异 图片像素比较大,另存为后放大图片就可以看清楚了 工程下载地址 QMLClassDia ...

  9. 通过 iTextSharp 实现PDF 审核盖章

    最近需要做一个PDF自动审核盖章的工作,其实就是读取PDF,然后再最后一页加入一个审核章印图片上去.看起来很简单,不过在开发过程中,还是遇到了一些问题,在这里记录一下. 主要遇到的问题是页面的旋转 和 ...

  10. http soap关系

    http:是一个客户端和服务器端请求和应答的标准(TCP).http协议其目的是为了提供一种发布和接收htttp页面的方法 一http协议的客户端与服务器的交互:由HTTP客户端发起一个请求,建立一个 ...