博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018.07.06 BZOJ 1588: HNOI2002营业额统计(非旋treap)
阅读量:5016 次
发布时间:2019-06-12

本文共 2669 字,大约阅读时间需要 8 分钟。

Time Limit: 5 Sec Memory Limit: 162 MB
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

一道与相似的简(s)单(b)题,仍然是用平衡树(setset)来维护前驱,后继,插入,然后就没了。本蒟蒻再次选择使用代码量相对较少的非旋treaptreap来实现。

代码如下:

#include
#define N 400005using namespace std;typedef pair
res;int rt,son[N][2],siz[N],val[N],rd[N],cnt;inline int build(int v){rd[++cnt]=rand(),val[cnt]=v,siz[cnt]=1,son[cnt][0]=son[cnt][1]=0;return cnt;}inline void pushup(int p){siz[p]=siz[son[p][0]]+siz[son[p][1]]+1;}inline int merge(int a,int b){ if(!a||!b)return a+b; if(rd[a]
=k){
tmp=split(son[p][0],k); son[p][0]=tmp.second,pushup(p); ans.first=tmp.first; ans.second=p; return ans; } tmp=split(son[p][1],k-siz[son[p][0]]-1); son[p][1]=tmp.first,pushup(p); ans.first=p; ans.second=tmp.second; return ans;}inline int rank(int p,int v){ if(!p)return 0; if(val[p]>v)return rank(son[p][0],v); return rank(son[p][1],v)+siz[son[p][0]]+1;}inline void ins(int v){ int k=rank(rt,v); res x=split(rt,k); int p=build(v); rt=merge(merge(x.first,p),x.second);}inline void del(int v){ int k=rank(rt,v); res x=split(rt,k); res y=split(x.first,k-1); rt=merge(y.first,x.second);}inline int pre(int p,int v){ if(!p)return -0x3f3f3f3f; if(val[p]<=v)return max(val[p],pre(son[p][1],v)); return pre(son[p][0],v);}inline int suf(int p,int v){ if(!p)return 0x3f3f3f3f; if(val[p]>=v)return min(val[p],suf(son[p][0],v)); return suf(son[p][1],v);}inline int read(){ int ans=0,w=1; char ch=ch=getchar(); while(!isdigit(ch)){
if(ch=='-')w=-1; ch=getchar(); } while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar(); return ans*w;}int main(){ int n=read(); int ans=0; while(n--){
int x=read(); if(!siz[rt])ans+=x; else{
int a=pre(rt,x),b=suf(rt,x); ans+=min(abs(a-x),abs(b-x)); } ins(x); } printf("%d",ans); return 0;}

转载于:https://www.cnblogs.com/ldxcaicai/p/9738468.html

你可能感兴趣的文章
博客转移,永久退出博客园
查看>>
ZJOI2004 午餐
查看>>
动态规划:ZOJ1074-最大和子矩阵 DP(最长子序列的升级版)
查看>>
react 环境搭建及配置:
查看>>
location对象位置操作,进行跳转
查看>>
ASP.NET jQuery 食谱13 (原创jQuery文本框字符限制插件-TextArea Counter)
查看>>
activiti util (1)
查看>>
ADO读写DateTime方式
查看>>
System services not available to Activities before onCreate()
查看>>
python内置函数(1)
查看>>
seq
查看>>
6.Hystrix-超时设置
查看>>
PHP反射API
查看>>
python之字典
查看>>
JC的小苹果 逆矩阵
查看>>
使用eclipse调试Gradle插件的方法
查看>>
Android 屏幕触摸事件之诡----dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent,onTouch...
查看>>
GDI编程开发
查看>>
分核桃
查看>>
单独给类添加XIB文件的步骤及注意点
查看>>