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. 如何更改AD域安全策略-密码必须符合复杂性要求

    通常我们在域系统-管理工具上面是找不到“域安全策略”的,我们只能找到“本地安全策略”,而更改“本地安全策略”是不会对域产生任何的作用的.下面这个步骤教你如何找到“域安全策略” 1.Start(开始)– ...

  2. "getElementsByClassName is not a function" 报错原因

    element.getElementsByClassName(""): 返回的含有该类的子元素数组,除了子元素以外的后代元素是获取不到的.要遍历使用,或者.element.getE ...

  3. TCP简单说|(上)

    本文在Creative Commons许可证下发布 TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人 ...

  4. python 服务端判断客户端异常断开

    在进行 python 套接字编程时,服务端程序要判断客户端是否异常断开[由于断电或者其他突发情况导致链接中断],可以通过以下几种方式判断: 1.如果通信协议中,设有心跳包,则可记录上次收到时间,将服务 ...

  5. cgroups

    CGROUPS官方解析,用户空间怎样监控 http://blog.chinaunix.net/uid-16763274-id-2103750.html cgroups概念 fr=aladdin&quo ...

  6. Razor小案例

    Model using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace ...

  7. Domino系统从UNIX平台到windows平台的迁移及备份

    单位机房的一台服务机器到折旧期了,换成了新购IBM机器X3950,而且都预装了windows 2003 server 标准版,所以只有把以前在Unix平台下跑的OA系统迁移到新的windows 200 ...

  8. 给iOS项目中添加图片,并通过UIImageView引用和显示该UIImage图片

    [问题] 关于iOS/iPhone中的文件选择对话框,用于用户去选择图片等文件 过程中,问题转换为,需要给当前iOS项目中,添加一个图片. 类似于Windows开发中的资源文件,其中图片文件属于资源的 ...

  9. groupadd---创建一个新的工作组

    groupadd命令   groupadd命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中. 语法 groupadd(选项)(参数) 选项 -g:指定新建工作组的id: -r:创建系统工 ...

  10. 使用wget工具抓取网页和图片 及 相关工具几个

    想保存一些网页,最后找到这 wget 的 shell脚本,虽然不是太理想,亲测可用呢. 使用wget工具抓取网页和图片   来源 https://my.oschina.net/freestyletim ...