bzoj 1588 營業額統計(splay)

2021-08-11 10:22:31 字數 1656 閱讀 2651

題目鏈結

description

tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。 tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一定的波動,當然一定的波動是能夠接受的,但是在某些時候營業額突變得很高或是很低,這就證明公司此時的經營狀況出現了問題。經濟管理學上定義了一種最小波動值來衡量這種情況: 該天的最小波動值 當最小波動值越大時,就說明營業情況越不穩定。 而分析整個公司的從成立到現在營業情況是否穩定,只需要把每一天的最小波動值加起來就可以了。你的任務就是編寫乙個程式幫助tiger來計算這乙個值。 第一天的最小波動值為第一天的營業額。  輸入輸出要求

input

第一行為正整數 ,表示該公司從成立一直到現在的天數,接下來的n行每行有乙個整數(有可能有負數) ,表示第i

天公司的營業額。

天數n<=32767,

每天的營業額ai <= 1,000,000。

最後結果t<=2^31

output

輸出檔案僅有乙個正整數,即sigma(每天最小的波動值) 。結果小於2^31 。

一道裸的splay題。

題目大意時每次插入乙個數,同時尋找與當前數差值最小的數。

隨機資料可以用二叉樹直接過,但是如果所有的數是單調遞減的,那麼複雜度就退化到了o(n^2)。

考慮splay,每次插入乙個數splay後,再bst內尋找前驅和後繼。

時間複雜度保證為o(nlogn)。

p.s:**中rotate和splay的壓(zhuang)行(bi)寫法不是很推薦,因為比賽時這樣寫很容易寫崩。

#include

#include

#include

#define maxn 100050

#define inf 1000000000

using

namespace

std;

typedef

long

long ll;

struct node

a[maxn*2];

int dfn=0,root,y,z,bo,n,x,p,q,hz;

ll ans=0ll;

inline

void rotate(int x,int k) //k=0左旋,k=1右旋

inline

void splay(int x)

else }}

root=x;

}inline

int pre(int x) //尋找前驅

inline

int suc(int x) //尋找後繼

inline

void insert(int now,int x)

//已有相同元素的節點

if (nowif (a[x].s[0]==-1) a[x].s[0]=dfn,a[dfn].f=x,a[dfn].s[0]=a[dfn].s[1]=-1,a[dfn].w=now;

else insert(now,a[x].s[0]);

}else

}int main()

printf("%lld",ans);

}

bzoj1588營業額統計

treap一發,每次尋找最接近的兩個以前的點計算即可,聽同學吐槽我的 風格很像黃學長,恩沒錯我是學習他的 風格的 include include include include include define n 50005 define inf 10000000 using namespace st...

bzoj1588營業額統計

description 營業額統計 tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一...

bzoj1588 營業額統計

2014年3月28日 5,309 3營業額統計 tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營...