Description

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

Input

第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i
天公司的营业额。
天数n<=32767,每天的营业额ai <= 1,000,000。
最后结果T<=2^31

Output

输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。

Sample Input
6
5
1
2
5
4
6

Sample Output
12

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

这里写代码片
/*
权值线段树
数组下标是权值,按顺序添加
*/#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long longusing namespace std;const int N=40000;
const int INF=0x33333333;
struct node{int x,y,mx,mn,v;
};
node tree[40000<<2];
int n,num[N];
ll ans=0;
struct node1{int bh,v;
};
node1 a[N];int cmp(const node1 &a,const node1 &b)
{return a.v<b.v;
}void update(int bh) //维护最大最小值
{int lc=bh<<1;int rc=bh<<1|1;if (tree[bh].x!=tree[bh].y){tree[bh].mx=max(tree[lc].mx,tree[rc].mx);tree[bh].mn=min(tree[lc].mn,tree[rc].mn);}return;
}void build(int bh,int l,int r)
{tree[bh].x=l;tree[bh].y=r;if (l==r) {tree[bh].mx=-INF;tree[bh].mn=INF;return;}int mid=(l+r)>>1;build(bh<<1,l,mid);build(bh<<1|1,mid+1,r);update(bh);
}void add(int bh,int mb,int v)
{if (tree[bh].x==mb&&tree[bh].y==mb) {tree[bh].v=v;  //记录实际值tree[bh].mx=v;tree[bh].mn=v;return;}int mid=(tree[bh].x+tree[bh].y)>>1;  //这种优美的写法可以减少常数if (mb<=mid) add(bh<<1,mb,v);if (mb>mid) add(bh<<1|1,mb,v);update(bh);
}int ask(int bh,int l,int r,int lx)
{  //把两种操作合并到一起,我可能是闲的if (r<l) {if (lx==1) return -INF;else return INF;}if (tree[bh].x>=l&&tree[bh].y<=r){if (lx==1)return tree[bh].mx;else return tree[bh].mn;}int mid=(tree[bh].x+tree[bh].y)>>1;int ans;if (lx==1) ans=-INF;else ans=INF;if (l<=mid){if (lx==1)ans=max(ans,ask(bh<<1,l,r,lx));else ans=min(ans,ask(bh<<1,l,r,lx));} if (r>mid) {if (lx==1)ans=max(ans,ask(bh<<1|1,l,r,lx));else ans=min(ans,ask(bh<<1|1,l,r,lx));}return ans;
}int main()
{scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%d",&a[i].v),a[i].bh=i;  //离散,真烦 sort(a+1,a+1+n,cmp);build(1,1,n);for (int i=1;i<=n;i++) num[a[i].bh]=i;  //离散化,位置是a[i].bh的数排序后排第i,离散后的值也是iadd(1,num[1],a[num[1]].v);  //第一天的最小波动就是本身ans+=(ll)a[num[1]].v;for (int i=2;i<=n;i++){add(1,num[i],a[num[i]].v);  int maxx=ask(1,1,num[i]-1,1); //小于ta的最大值int minn=ask(1,num[i]+1,n,2); //大于ta的最小值int t=min(abs(a[num[i]].v-minn),abs(maxx-a[num[i]].v));ans+=(ll)t; //开ll} printf("%lld",ans);return 0;
}

转载于:https://www.cnblogs.com/wutongtong3117/p/7673520.html

bzoj1588营业额统计相关推荐

  1. bzoj1588 营业额统计

    裸的平衡树题,splay做的... 存下板子 #include<cstdio> #include<cstring> #include<algorithm> #def ...

  2. bzoj1588[HNOI2002]营业额统计

    bzoj1588[HNOI2002]营业额统计 题意: n天,每天得到一个值,要求输出每一天和这天得到的值相差最小的之前天得到的值与这个值的差的和.n不知道,不过O(nlog2n)可写. 题解: 说是 ...

  3. 【链表】BZOJ1588: [HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 17555  Solved: 7179 [Submit][S ...

  4. bzoj1588 [HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 17931  Solved: 7391 [Submit][S ...

  5. [BZOJ 1588] [HNOI 2002] 营业额统计

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

  6. 【Treap】bzoj1588-HNOI2002营业额统计

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

  7. [BZOJ 1588][HNOI 2002] 营业额统计

    这果然是在那个没有STL的年代出的题 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 16648  Solv ...

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

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

  9. P2234 [HNOI2002]营业额统计

    P2234 [HNOI2002]营业额统计 这题没有用splay写,罪过 就是找一下前驱与后继,然后判断一下这个值出现没出现过 判重就是最暴力的拿数组判断就可以了 只不过,值有可能为负数,所以整体平移 ...

最新文章

  1. hdu 5492(矩阵模型的变形)
  2. 多功能监护系统开发与设计
  3. 【linux】zip unzip
  4. jquery UI集合
  5. CCF2016.4 - C题
  6. Java分布式锁的概念以及使用优点
  7. 微软补丁地址以及查找方式
  8. 算法排序----二分排序法
  9. MS08067红队攻防第一期班 精彩回顾~
  10. linux tc工具,Linux TC软件系统损坏自助恢复的工具.TC刷机,TC修复,TCPUP,TCP-UP
  11. 双碳实力 | 谱尼成为上海市环境保护产业协会应对气候变化专委会成员单位
  12. 将.fits数据转换为.png图像
  13. 【单片机开发平台】msp430几种不同开发平台的对比
  14. BootStrap按钮和图片
  15. springboot 集成 actuator
  16. JAVA//JAVA基本程序设计架构
  17. 战地4服务器物理地址,战地4 游戏服务器地址
  18. 01. 全彩RGB LED灯模块使用教程
  19. lisp实现框选裁切_《剪切成虚线》v3.1版(支持框选)
  20. 分享一款好用的图表制作软件,简单、美观又高效!

热门文章

  1. .NET代码编写规范 整理
  2. nsfocus 十周年了 时间过得好快啊... 恭喜下...
  3. kafka-manager 安装
  4. github Android-Universal-Image-Loader
  5. 通过案例对SparkStreaming透彻理解-3
  6. 快嘉开发框架1.0和示例介绍及使用说明
  7. pdo 连接数据库 报错 could not find driver 解决方法
  8. 典型的Linux系统启动需要完成的服务
  9. Nagios Apache报Internal Server Error错误的解决方法
  10. VMware Workstation 8正式版下载+密钥序列号