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. 无闻go编程基础笔记

    Go语言做Web编程非常方便,并且在开发效率和程序运行效率方面都非常优秀.相比于Java,其最大的优势就是简便易用,而相比于PHP,它最大的优势就是性能好. (go做web)推荐Gorilla的库,里 ...

  2. 00076_BigDecimal

    1.在程序中执行下列代码,会出现什么问题? System.out.println(0.09 + 0.01); System.out.println(1.0 - 0.32); System.out.pr ...

  3. 【Henu ACM Round#14 B】Duff in Love

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 让你在n的因子里面找一个最大的数字x 且x的因子全都不是完全平方数(y^2,y>1) O(sqrt(n))找出n的所有因子. ...

  4. 发送邮件被退回,提示: Helo command rejected: Invalid name 错误

    我自己配置的 postfix + dovecot server, 配置了outlook 后, 相同的账号. 在有的电脑上能收发成功, 在有的电脑上发送邮件就出现退信.提示 Helo command r ...

  5. MySQL改变表的存储引擎

    MySQL提供了多种数据库存储引擎,存储引擎负责MySQL数据库中的数据的存储和提取.不同的存储引擎具有不同的特性,有时可能须要将一个已经存在的表的存储引擎转换成另外的一个存储引擎.有非常多方法能够完 ...

  6. DuiVision开发教程(19)-菜单

    DuiVision菜单类是CDuiMenu.有两种显示的位置,一种是在窗体顶部某个button点击后能够下拉一个菜单,还有一种是托盘图标的右键菜单. 窗体中的菜单定义方式是xml文件里设置某个butt ...

  7. C++ 不输入回车就不结束输入的实现方法

    方法一 char mystr[128]; mystr[0] = '\0'; char c = getchar(); int i=0; while(c!='\n') { mystr[i] = c; c ...

  8. TCP/IP协议族-----20、远程登录:TELNET与SSH

  9. Vue v-if v-for v-bind v-on

    v-if <div v-if="type === 'A'"> A </div> <div v-else-if="type === 'B'&q ...

  10. 5.brackets 快捷键 有大用

    转自:https://blog.csdn.net/u012011360/article/details/41209223 ctrl+b 当选中一个文本时,会出现相同的文本,被高亮显示 按ctrl+b ...