BZOJ1588(HNOI2002)营业额统计
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1588
1588: [HNOI2002]营业额统计
Time Limit: 5 Sec Memory Limit: 162 MBDescription
营
业额统计
Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。
Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业
额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了
一种最小波动值来衡量这种情况:
该天的最小波动值
当最小波动值越大时,就说明营业情况越不稳定。
而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。
第一天的最小波动值为第一天的营业额。
输入输出要求
Input
第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个正整数 ,表示第i天公司的营业额。
Output
输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。
Sample Input
6
5
1
2
5
4
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
卧槽。。这题WA了无数次。。
首先,这题数据有问题,读入的时候要scanf("%d",&val)!=EOF,因为数据有丢失。
第二,就没有第二了,某个数的前驱在这里要特判一下是否是本身。。又是一道裸splayT_T。。。
Codes:
1 #include<set> 2 #include<map> 3 #include<queue> 4 #include<cmath> 5 #include<cstdio> 6 #include<cstdlib> 7 #include<cstring> 8 #include<iostream> 9 #include<algorithm> 10 using namespace std; 11 const int N = 50010; 12 const int maxint = 214748364; 13 #define fa(i) (T[i].p) 14 #define Ch1 (T[i].s[0]) 15 #define Ch2 (T[i].s[1]) 16 #define Loc(i) (T[fa(i)].s[1]==i) 17 #define Sets(a,b,c){T[a].s[c] = b; fa(b) = a;} 18 #define For(i,n) for(int i=1;i<=n;i++) 19 #define Rep(i,l,r) for(int i=l;i<=r;i++) 20 #define Down(i,r,l) for(int i=r;i>=l;i--) 21 22 struct tnode{ 23 int s[2],num,v,p; 24 }T[N]; 25 26 int n,val,root,tot,ans; 27 28 void Rot(int x){ 29 int y = fa(x) , z = fa(y); 30 int lx = Loc(x) , ly = Loc(y); 31 Sets(y,T[x].s[!lx],lx); 32 Sets(z,x,ly); 33 Sets(x,y,!lx); 34 } 35 36 void Splay(int i,int goal){ 37 while(fa(i)!=goal){ 38 if(fa(fa(i))!=goal) Rot(fa(i)); 39 Rot(i); 40 } 41 if(!goal) root = i; 42 } 43 44 void Insert(int V,int i){ 45 if(!i){ 46 root = ++tot; 47 T[tot].v = V;T[tot].p = 0;T[tot].num = 1; 48 return; 49 } 50 if(T[i].v==V){ 51 T[i].num++; 52 Splay(i,0); 53 } 54 else { 55 if(!T[i].s[V>T[i].v]){ 56 T[i].s[V>T[i].v] = ++tot; 57 T[tot].p = i;T[tot].v = V;T[tot].num = 1; 58 Splay(tot,0); 59 } 60 else Insert(V,T[i].s[V>T[i].v]); 61 } 62 } 63 64 int pred(int i){ 65 int Next = T[i].s[0]; 66 if(T[i].num>1) return T[i].v; 67 if(!Next) return maxint; 68 while(T[Next].s[1]) Next = T[Next].s[1]; 69 return T[Next].v; 70 } 71 72 int succ(int i){ 73 int Next = T[i].s[1]; 74 if(T[i].num>1) return T[i].v; 75 if(!Next) return maxint; 76 while(T[Next].s[0]) Next = T[Next].s[0]; 77 return T[Next].v; 78 } 79 80 int main(){ 81 scanf("%d",&n); 82 For(i,n){ 83 if(scanf("%d",&val)==EOF) val = 0; 84 Insert(val,root); 85 int Pred = pred(root) , Succ = succ(root); 86 if(Pred==maxint&&Succ==maxint) Pred = val; 87 if(i!=1) ans+=min(abs(Pred-val),abs(Succ-val)); 88 else ans+=val; 89 } 90 printf("%d\n",ans); 91 return 0; 92 }
显然这题可以用set直接写。。