https://www.luogu.org/problem/show?pid=2234

题目描述

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

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

当最小波动值越大时,就说明营业情况越不稳定。

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

第一天的最小波动值为第一天的营业额。

输入输出格式

输入格式:

输入由文件’turnover.in’读入。

第一行为正整数n(n<=32767) ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数ai(|ai|<=1000000) ,表示第i天公司的营业额,可能存在负数。

输出格式:

输入输出样例

输入样例#1:

6
5
1
2
5
4
6
输出样例#1:

12

说明

结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12

ct,该记l,r还是要记得。。

以权值为下标建一颗线段树.
每次插一个新值, 并查询大于它的最小值和小于它的最大值.

 #include <algorithm>
#include <cstdio> using namespace std; const int N(+);
int n,a[N],mark[N]; struct Node
{
int a,mark;
}node[N];
bool cmp(Node c,Node b)
{
return c.a<b.a;
} #define lc (now<<1)
#define rc (now<<1|1)
#define INF 0x7fffffff
struct Tree
{
int l,r,maxx,minn,val;
}tree[N<<];
void Pushup(int now)
{
tree[now].val=tree[lc].val+tree[rc].val;
tree[now].maxx=max(tree[lc].maxx,tree[rc].maxx);
tree[now].minn=min(tree[lc].minn,tree[rc].minn);
}
void Build(int now,int l,int r)
{
tree[now].l=l;
tree[now].r=r;
tree[now].maxx=-;
tree[now].minn=INF-;
if(l==r) return ;
int mid=l+r>>;
Build(lc,l,mid);
Build(rc,mid+,r);
}
void Change(int now,int x)
{
if(tree[now].l==tree[now].r)
{
tree[now].val=;
tree[now].maxx=tree[now].l;
tree[now].minn=tree[now].r;
return ;
}
int mid=tree[now].l+tree[now].r>>;
if(x<=mid) Change(lc,x);
if(x>mid) Change(rc,x);
Pushup(now);
}
int Q_max(int now,int L,int R)
{
if(R<L) return -;
if(tree[now].val==) return -;
if(tree[now].l>=L&&tree[now].r<=R) return tree[now].maxx;
int tmp=-;
int mid=tree[now].l+tree[now].r>>;
if(L<=mid) tmp=max(tmp,Q_max(lc,L,R));
if(R>mid) tmp=max(tmp,Q_max(rc,L,R));
return tmp;
}
int Q_min(int now,int L,int R)
{
if(R<L) return INF-;
if(tree[now].val==) return INF-;
if(tree[now].l>=L&&tree[now].r<=R) return tree[now].minn;
int tmp=INF,mid=tree[now].l+tree[now].r>>;
if(L<=mid) tmp=min(tmp,Q_min(lc,L,R));
if(R>mid) tmp=min(tmp,Q_min(rc,L,R));
return tmp;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&node[i].a);
node[i].mark=i;
}
sort(node+,node+n+,cmp);
int cnt=;
a[]=node[].a;
mark[node[].mark]=cnt;
for(int i=;i<=n;i++)
{
if(node[i-].a!=node[i].a) cnt++;
a[cnt]=node[i].a;
mark[node[i].mark]=cnt;
}
Build(,,cnt);
int ans=a[mark[]];
Change(,mark[]);
for(int i=;i<=n;i++)
{
int tmp=INF,maxx=Q_max(,,mark[i]),minn=Q_min(,mark[i]+,n);
if(maxx!=-) tmp=min(tmp,a[mark[i]]-a[maxx]);
if(minn!=INF-) tmp=min(tmp,a[minn]-a[mark[i]]);
ans+=tmp;
Change(,mark[i]);
}
printf("%d",ans);
return ;
}

洛谷—— P2234 [HNOI2002]营业额统计的更多相关文章

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

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

  2. [洛谷P2234][HNOI2002] 营业额统计 - Treap

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

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

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

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

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

  5. 洛谷P2234 [HNOI2002]营业额统计(01Tire树)

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

  6. 洛谷 2234 [HNOI2002]营业额统计——treap(入门)

    题目:https://www.luogu.org/problemnew/show/P2234 学习了一下 treap 的写法. 学习材料:https://blog.csdn.net/litble/ar ...

  7. 洛谷.2234.[HNOI2002]营业额统计(Splay)

    题目链接 //模板吧 #include<cstdio> #include<cctype> #include<algorithm> using namespace s ...

  8. SET || BZOJ 1588: [HNOI2002]营业额统计 || Luogu P2234 [HNOI2002]营业额统计

    题面:P2234 [HNOI2002]营业额统计 题解:随便写写 注意:cmath中abs函数返回的是一个浮点数,在bzoj上会ce 代码: #include<cstdio> #inclu ...

  9. [luogu P2234] [HNOI2002]营业额统计

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

随机推荐

  1. JAVA工程命名规范

    Java推荐的包声明命名约定是反向域名. 例如 - com.abysm.myproject

  2. AES加密解密&amp;&amp;SHA1、SHA加密&amp;&amp;MD5加密

    AES加密解密 SHA1.SHA加密 MD5加密 二话不说立即附上代码: package com.luo.util; import java.io.UnsupportedEncodingExcepti ...

  3. Struts(18)标签

    控件标签 Struts 2 的标签有一组标签.更easy控制流程页面运行.下面是重要的Struts2控制标签列表: if /else 标签: 这些标签运行可在每一种语言找到的一种基本条件流程. 'If ...

  4. C#最简单的登录Web服务

    因为演示程序,所以有下面问题: 1.password是明码传输. 本文在  C#建立最简单的web服务,无需IIS  的基础上完毕. 详细步骤: 一.RequestProcessor添加变量mLogi ...

  5. rtmp,rtsp,hLS区别

    流媒体协议一共三种:rtmp,rtsp,http live streaming(apple和adobe各一种)rtmp是adobe的,rtsp android native支持,http live s ...

  6. 74.QT窗口实现类的封装

    #include "mainwindow.h" #include <QApplication> #include <windows.h> //定义一个窗口类 ...

  7. mvc4 视图中的form如何获取

    public ActionResult Index(FormCollection form)         {             var Name = form["字段名" ...

  8. JavaScript--数据结构与算法之二叉树

    树是一种非线性的数据结构,以分层的方式存储数据. 二叉树:查找非常快,而且二叉树添加或者删除元素也非常快. 形象的可以描述为组织结构图,用来描述一个组织的结构.树是由边连接的点组成.树的一些基本概念: ...

  9. crmjs区分窗口是否是高速编辑

    有时候,我们须要区分打开的窗口是否是高速编辑页面,在上面做一些逻辑处理: 窗口上面附加的js代码: function loadFrom() {     var formType = Xrm.Page. ...

  10. Nginx系列(一)--nginx是什么?

    一.介绍 Nginx是一个高性能的HTTP和反向代理server,也是一个IMAP/POP3/SMTP代理server. Nginx是一款轻量级的Webserver/反向代理server以及电子邮件代 ...