洛谷—— P2234 [HNOI2002]营业额统计

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还是要记得。。

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

  1 #include <algorithm>
  2 #include <cstdio>
  3 
  4 using namespace std;
  5 
  6 const int N(32767+666);
  7 int n,a[N],mark[N];
  8 
  9 struct Node
 10 {
 11     int a,mark;
 12 }node[N];
 13 bool cmp(Node c,Node b)
 14 {
 15     return c.a<b.a;
 16 }
 17 
 18 #define lc (now<<1)
 19 #define rc (now<<1|1)
 20 #define INF 0x7fffffff
 21 struct Tree
 22 {
 23     int l,r,maxx,minn,val;
 24 }tree[N<<2];
 25 void Pushup(int now)
 26 {
 27     tree[now].val=tree[lc].val+tree[rc].val;
 28     tree[now].maxx=max(tree[lc].maxx,tree[rc].maxx);
 29     tree[now].minn=min(tree[lc].minn,tree[rc].minn);
 30 }
 31 void Build(int now,int l,int r)
 32 {
 33     tree[now].l=l;
 34     tree[now].r=r;
 35     tree[now].maxx=-1;
 36     tree[now].minn=INF-1;
 37     if(l==r) return ;
 38     int mid=l+r>>1;
 39     Build(lc,l,mid);
 40     Build(rc,mid+1,r);
 41 }
 42 void Change(int now,int x)
 43 {
 44     if(tree[now].l==tree[now].r)
 45     {
 46         tree[now].val=1;
 47         tree[now].maxx=tree[now].l;
 48         tree[now].minn=tree[now].r;
 49         return ;
 50     }
 51     int mid=tree[now].l+tree[now].r>>1;
 52     if(x<=mid) Change(lc,x);
 53     if(x>mid) Change(rc,x);
 54     Pushup(now);
 55 }
 56 int Q_max(int now,int L,int R)
 57 {
 58     if(R<L) return -1;
 59     if(tree[now].val==0) return -1;
 60     if(tree[now].l>=L&&tree[now].r<=R) return tree[now].maxx;
 61     int tmp=-2;
 62     int mid=tree[now].l+tree[now].r>>1;
 63     if(L<=mid) tmp=max(tmp,Q_max(lc,L,R));
 64     if(R>mid) tmp=max(tmp,Q_max(rc,L,R));
 65     return tmp;
 66 }
 67 int Q_min(int now,int L,int R)
 68 {
 69     if(R<L) return INF-1;
 70     if(tree[now].val==0) return INF-1;
 71     if(tree[now].l>=L&&tree[now].r<=R) return tree[now].minn;
 72     int tmp=INF,mid=tree[now].l+tree[now].r>>1;
 73     if(L<=mid) tmp=min(tmp,Q_min(lc,L,R));
 74     if(R>mid) tmp=min(tmp,Q_min(rc,L,R));
 75     return tmp;
 76 }
 77 
 78 int main()
 79 {
 80     scanf("%d",&n);
 81     for(int i=1;i<=n;i++)
 82     {
 83         scanf("%d",&node[i].a);
 84         node[i].mark=i;
 85     }
 86     sort(node+1,node+n+1,cmp);
 87     int cnt=1;
 88     a[1]=node[1].a;
 89     mark[node[1].mark]=cnt;
 90     for(int i=2;i<=n;i++)
 91     {
 92         if(node[i-1].a!=node[i].a) cnt++;
 93         a[cnt]=node[i].a;
 94         mark[node[i].mark]=cnt;
 95     }
 96     Build(1,1,cnt);
 97     int ans=a[mark[1]];
 98     Change(1,mark[1]);
 99     for(int i=2;i<=n;i++)
100     {
101         int tmp=INF,maxx=Q_max(1,1,mark[i]),minn=Q_min(1,mark[i]+1,n);
102         if(maxx!=-1) tmp=min(tmp,a[mark[i]]-a[maxx]);
103         if(minn!=INF-1) tmp=min(tmp,a[minn]-a[mark[i]]);
104         ans+=tmp;
105         Change(1,mark[i]); 
106     }
107     printf("%d",ans);
108     return 0;
109 }

 

转载于:https://www.cnblogs.com/Shy-key/p/7300587.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值