日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ 1588: [HNOI2002]营业额统计

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 1588: [HNOI2002]营业额统计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

Solution

  • 這題是一道裸的平衡樹,練算法的好題。

  • 題目是求對于第i個數,求在前i-1個數中、最接近這個數的那個。

  • 這其實就相當于每次插入操作,求前驅和后繼。

  • 由于這題只有插入和查詢操作,以下代碼使用了簡短的Splay算法。

Code

#include<cstdio> using namespace std; const int N=1<<15+2,MX=1e9; int tot,root,ans; int s[N][2],fa[N],key[N]; inline int read() {int data=0,w=1; char ch=0;while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();if(ch=='-') ch=getchar(),w=-1;while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data*w; } inline int min(int x,int y) {return x<y?x:y; } inline bool pd(int x) {return x==s[fa[x]][1]; } inline void rotate(int x) {int y=fa[x],w=pd(x);if(fa[x]=fa[y]) s[fa[y]][pd(y)]=x;fa[s[y][w]=s[x][w^1]]=y;s[fa[y]=x][w^1]=y; } inline void splay(int x) {for(int y;y=fa[x];rotate(x))if(fa[y]) rotate(pd(x)==pd(y)?y:x);root=x; } inline void ins(int &x,int y,int v) {if(!x){x=++tot;fa[x]=y;key[x]=v;return;}ins(s[x][key[x]<=v],x,v); } inline int search(int x,int v) {while(key[x]!=v)if(key[x]<v){if(!s[x][1]) break;x=s[x][1];}else{if(!s[x][0]) break;x=s[x][0];}return x; } int main() {int n=read(),x=read();ins(root,0,ans=x);ins(root,0,MX);ins(root,0,-MX);while(--n){ins(root,0,x=read());splay(tot);int p=search(s[root][0],MX);int q=search(s[root][1],-MX);ans+=min(x-key[p],key[q]-x);}printf("%d",ans);return 0; }

總結

以上是生活随笔為你收集整理的BZOJ 1588: [HNOI2002]营业额统计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。