bzoj1588
营业额统计
营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。 输入输出要求
Input第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i
天公司的营业额。
天数n<=32767,
每天的营业额ai <= 1,000,000。
最后结果T<=2^31
Output
输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。
Sample Input6 5 1 2 5 4 6Sample Output12 Hint
结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12
该题数据bug已修复.----2016.5.15
sol:并不知道这在考什么?如果是平衡树的话,似乎set直接水过了,就是找第一个比它小的和比它大的元素
Ps:set中begin是第一个元素,但是end不是最后一个元素,end-1才是
#include <bits/stdc++.h> using namespace std; typedef int ll; inline ll read() { ll s=0; bool f=0; char ch=' '; while(!isdigit(ch)) { f|=(ch=='-'); ch=getchar(); } while(isdigit(ch)) { s=(s<<3)+(s<<1)+(ch^48); ch=getchar(); } return (f)?(-s):(s); } #define R(x) x=read() inline void write(ll x) { if(x<0) { putchar('-'); x=-x; } if(x<10) { putchar(x+'0'); return; } write(x/10); putchar((x%10)+'0'); return; } #define W(x) write(x),putchar(' ') #define Wl(x) write(x),putchar('\n') int n; multiset<int>S; int main() { int i,x,y,ans=0; R(n); R(x); ans+=x; S.insert(x); R(y); ans+=abs(x-y); S.insert(y); for(i=3;i<=n;i++) { R(x); multiset<int>::iterator it=S.lower_bound(x); if(it==S.begin()) { ans+=(*it)-x; } else if(it==S.end()) { it--; ans+=x-(*it); } else { int tmp=(*it)-x; *it--; tmp=min(tmp,abs(x-(*it))); ans+=tmp; } S.insert(x); } Wl(ans); return 0; } /* input 6 5 1 2 5 4 6 output 12 */
我带着Splay代码回来了(但还是TLE,可能只有treap能过,完全不想学treap了)
#include <bits/stdc++.h> using namespace std; typedef int ll; inline ll read() { ll s=0; bool f=0; char ch=' '; while(!isdigit(ch)) { f|=(ch=='-'); ch=getchar(); } while(isdigit(ch)) { s=(s<<3)+(s<<1)+(ch^48); ch=getchar(); } return (f)?(-s):(s); } #define R(x) x=read() inline void write(ll x) { if(x<0) { putchar('-'); x=-x; } if(x<10) { putchar(x+'0'); return; } write(x/10); putchar((x%10)+'0'); return; } #define W(x) write(x),putchar(' ') #define Wl(x) write(x),putchar('\n') const int N=100005,inf=0x3f3f3f3f; namespace Pht { int Points,Root; int Child[N][2]; int Parent[N]; int Quanzhi[N]; int Cnt[N]; int Size[N]; inline void Init(); inline int Check(int x); inline void PushUp(int x); inline void Rotate(int x); inline void Splay(int At,int To); inline void Insert(int x); inline void Find(int x); inline int Ask_Lower(int x); inline int Ask_Upper(int x); inline void Init() { Points=Root=0; Insert(-inf); Insert(inf); return; } inline int Check(int x) { return (Child[Parent[x]][0]==x)?0:1; } inline void PushUp(int x) { Size[x]=Cnt[x]+Size[Child[x][0]]+Size[Child[x][1]]; } inline void Rotate(int x) { int y,z,oo; y=Parent[x]; z=Parent[y]; oo=Check(x); Child[y][oo]=Child[x][oo^1]; Parent[Child[x][oo^1]]=y; Child[z][Check(y)]=x; Parent[x]=z; Child[x][oo^1]=y; Parent[y]=x; PushUp(x); PushUp(y); } inline void Splay(int At,int To) { while(Parent[At]!=To) { int Father=Parent[At]; if(Parent[Father]==To) { Rotate(At); } else if(Check(At)==Check(Father)) { Rotate(Father); Rotate(At); } else { Rotate(At); Rotate(At); } } if(To==0) Root=At; } inline void Insert(int Val) { int Now=Root,Par=0; while(Now&&(Quanzhi[Now]!=Val)) { Par=Now; Now=Child[Now][(Val>Quanzhi[Now])?1:0]; } if(Now) { Cnt[Now]++; Size[Now]++; } else { Now=++Points; if(Par) { Child[Par][(Val>Quanzhi[Par])?1:0]=Now; } Child[Now][0]=Child[Now][1]=0; Parent[Now]=Par; Quanzhi[Now]=Val; Cnt[Now]=Size[Now]=1; } Splay(Now,0); return; } inline void Find(int Val) { int Now=Root; if(!Now) return; while(Child[Now][(Val>Quanzhi[Now])?1:0]&&(Quanzhi[Now]!=Val)) { Now=Child[Now][(Val>Quanzhi[Now])?1:0]; } Splay(Now,0); } inline int Ask_Lower(int Val) { Find(Val); int Now=Root; if(Quanzhi[Now]<=Val) return Now; Now=Child[Now][0]; while(Child[Now][1]) Now=Child[Now][1]; return Now; } inline int Ask_Upper(int Val) { Find(Val); int Now=Root; if(Quanzhi[Now]>=Val) return Now; Now=Child[Now][1]; while(Child[Now][0]) Now=Child[Now][0]; return Now; } } int n; int main() { int i,x,ans=0; R(n); Pht::Init(); R(x); ans+=x; Pht::Insert(x); for(i=2;i<=n;i++) { R(x); int Q1=Pht::Quanzhi[Pht::Ask_Lower(x)],Q2=Pht::Quanzhi[Pht::Ask_Upper(x)]; ans+=min(x-Q1,Q2-x); Pht::Insert(x); } Wl(ans); return 0; } /* input 6 5 1 2 5 4 6 output 12 */
河田は河田、赤木は赤木……。
私は誰ですか。教えてください、私は誰ですか。
そうだ、俺はあきらめない男、三井寿だ!