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. 2014百度面试题目---“求比指定整数大且最小的不重复数”解答
  2. 未解决ora-01034、ora-03113、oracle使用RMAN删除归档日志
  3. pt-table-checksum与pt-table-sync使用实践
  4. javaweb学习总结(十九)——JSP标签
  5. 【数据结构与算法】之深入解析“穿过迷宫的最少移动次数”的求解思路与算法示例
  6. springMVC——注解配置方式实现Helloworld
  7. mysql值域_MySQL学习笔记(三)
  8. php头尾分离,laravel怎么做模板的头尾分离
  9. jira7.12.1安装与破解
  10. 票价最低10元 北京大兴国际机场线票价方案正式启用
  11. 【NOI2002】银河英雄传说
  12. 搭建MySQL高可用架构MHA
  13. 大学二级计算机基础知识,浙江省大学生计算机基础知识与应用能力等级考试二级(V......
  14. js 父子标签同时设置onclick,子标签触发父标签onclick解决办法
  15. 软考中级都考什么?难度大吗?
  16. E280 P0410故障修复
  17. adguard自定义_openwrt上装adguard以及实用教程
  18. DeleteObject()的使用
  19. pmp培训机构哪个比较好,求推荐?
  20. Python安装与卸载流程

热门文章

  1. Class类 获取Class对象
  2. .netcore2.0 发布CentOS7
  3. UNION 和UNION ALL的区别
  4. Install marvel and head plugin for ealsticsearch
  5. Chrome一直提示“adobe flash player 因过期而遭阻止” ,如何解决?
  6. switch..case使用
  7. 数据加密类型及创建和申请CA证书
  8. Spring 从零開始-05
  9. Loadrunner中socket协议中的三个关联函数
  10. u检验、t检验、F检验、X2检验 (转)