1588: [HNOI2002]营业额统计

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 16863  Solved: 6789
[Submit][Status][Discuss]

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

HINT

结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12

该题数据bug已修复.----2016.5.15

  1. /*
  2. 离散化
  3. 权值线段树查询前驱后继
  4. */
  5. #include<iostream>
  6. #include<cstdio>
  7. #include<cstring>
  8. #include<algorithm>
  9.  
  10. #define inf 0x3f3f3f3f
  11. #define N 40000
  12.  
  13. using namespace std;
  14. struct tree
  15. {
  16. int l,r,mx,mn,sum;
  17. }tr[N<<];
  18. int n,m,ans,tot,cnt;
  19. int a[N],b[N],val[N],num[N];
  20.  
  21. inline void pushup(int k)
  22. {
  23. tr[k].sum=tr[k<<].sum+tr[k<<|].sum;
  24. if(tr[k].sum)
  25. {
  26. tr[k].mn=min(tr[k<<].mn,tr[k<<|].mn);
  27. tr[k].mx=max(tr[k<<].mx,tr[k<<|].mx);
  28. }
  29. }
  30.  
  31. void build(int k,int l,int r)
  32. {
  33. tr[k].l=l;tr[k].r=r;tr[k].mn=inf;tr[k].mx=;
  34. if(l==r)
  35. {
  36. tr[k].sum=;
  37. return;
  38. }
  39. int mid=(l+r)>>;
  40. build(k<<,l,mid);build(k<<|,mid+,r);
  41. }
  42.  
  43. void insert(int k,int pos)
  44. {
  45. if(tr[k].l==tr[k].r && tr[k].l==pos)
  46. {
  47. tr[k].sum++;
  48. tr[k].mn=tr[k].mx=pos;
  49. return;
  50. }
  51. int mid=(tr[k].l+tr[k].r)>>;
  52. if(pos<=mid) insert(k<<,pos);
  53. if(pos>mid)insert(k<<|,pos);
  54. pushup(k);
  55. }
  56.  
  57. int query(int k,int l,int r,int flag)
  58. {
  59. if(tr[k].l==l && tr[k].r==r)
  60. return flag==?tr[k].mn:tr[k].mx;
  61. pushup(k);
  62. int mid=(tr[k].r+tr[k].l)>>;
  63. if(l>mid) return query(k<<|,l,r,flag);
  64. else if(r<=mid) return query(k<<,l,r,flag);
  65. else
  66. {
  67. if(flag==) return min(query(k<<,l,mid,flag),query(k<<|,mid+,r,flag));
  68. else return max(query(k<<,l,mid,flag),query(k<<|,mid+,r,flag));
  69. }
  70. }
  71.  
  72. int main()
  73. {
  74. scanf("%d",&n);memset(val,,sizeof val);
  75. for(int i=;i<=n;i++)
  76. {
  77. scanf("%d",&a[i]);
  78. b[i]=a[i];val[i]=a[i];
  79. }
  80. sort(b+,b+n+);
  81. tot=unique(b+,b+n+)-b-;
  82. for(int i=;i<=n;i++) a[i]=lower_bound(b+,b+tot+,a[i])-b,num[a[i]]=i;
  83. build(,,tot);ans=val[];insert(,a[]);
  84. for(int i=;i<=n;i++)
  85. {
  86. int q=query(,,a[i],);
  87. int h=query(,a[i],tot,);
  88. if(h==inf)ans+=abs(val[num[a[i]]]-val[num[q]]);
  89. else ans+=min(abs((val[num[a[i]]]-val[num[q]])),abs((val[num[h]]-val[num[a[i]]])));
  90. insert(,a[i]);
  91. }
  92. printf("%d\n",ans);
  93. }

bzoj1588: [HNOI2002]营业额统计(权值线段树)的更多相关文章

  1. HDU6621 K-th Closest Distance 第 k 小绝对值(主席树(统计范围的数有多少个)+ 二分 || 权值线段树+二分)

    题意:给一个数组,每次给 l ,r, p, k,问区间 [l, r] 的数与 p 作差的绝对值的第 k 小,这个绝对值是多少 分析:首先我们先分析单次查询怎么做: 题目给出的数据与多次查询已经在提示着 ...

  2. 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] D ...

  3. 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题

    “队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄>     线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...

  4. 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树

    原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...

  5. BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树

    BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资. ...

  6. cf1073G Yet Another LCP Problem (SA+权值线段树)

    反正先求一遍sa 然后这个问题可以稍微转化一下 默认比较A.B数组中元素的大小都是比较它们rank的大小,毕竟两个位置的LCP就是它们rank的rmq 然后每次只要求B[j]>=A[i]的LCP ...

  7. BZOJ2141排队——树状数组套权值线段树(带修改的主席树)

    题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...

  8. 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)

    传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...

  9. BZOJ_3224 Tyvj 1728 普通平衡树 【离散化+权值线段树】

    一 题面 Tyvj 1728 普通平衡树 二 分析 比较明显是可以用平衡二叉搜索树(splay)做的. 用权值线段树做,前提就是要先离散化,因为权值线段树维护的值域信息. 板子. 三 AC代码 #in ...

随机推荐

  1. Lazarus 1.44升级到1.6 UTF8处理发生变化了

    首先这里真的要强调一下,由于Freepascal升级到3.0后,FPC的内部将整个代码处理由AnsiString改为了UTF8编码(RTL with default codepage UTF-8). ...

  2. MFC cstring 型转化成 double型

    cstring szNum; GetDlgItemText(IDC_EDIT1, szNum); double Num; Num = _ttol(szNum); 转化成长整型 Num = _tstof ...

  3. CVPR 2017 Paper list

    CVPR2017 paper list Machine Learning 1 Spotlight 1-1A Exclusivity-Consistency Regularized Multi-View ...

  4. python str操作

    1. str.format():使用“{}”占位符格式化字符串(占位符中的索引号形式和键值对形式可以混合使用). 1 >>> string = 'python{}, django{} ...

  5. Appium 教您完美win10安装Appium1.7.2支持win客户端自动化

    参考内容: https://testerhome.com/topics/10193https://testerhome.com/topics/8223https://testerhome.com/to ...

  6. soui edit passwrod模式下禁用输入法

    一直在用soui做客户端界面,今天发现密码edit在中文输入法下不能输入密码.我在想难道不是这样吗,密码就该用英文输入法啊. 然后我就用mfc的做了个demo,发现mfc的edit在密码模式下是可以用 ...

  7. Python 字符串和数字

    Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...

  8. 第十节:pandas之loc()、iloc()与ix()索引

  9. 【codeforces 514E】Darth Vader and Tree

    [题目链接]:http://codeforces.com/problemset/problem/514/E [题意] 无限节点的树; 每个节点都有n个儿子节点; 且每个节点与其第i个节点的距离都是ai ...

  10. mbr gpt

    超过2T硬盘的磁盘要用gpt格式,准确地说,应该是分区超过2T地硬盘要选用GPT模式. 做个小推广:程序员经常久坐,颈椎毛病比较多,特别推荐ventry颈椎保健枕