好久沒打過資料結構了哈... 把這道題作為splay 的複習題吧,也是個板子.
tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。
tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一定的波動,當然一定的波動是能夠接受的,但是在某些時候營業額突變得很高或是很低,這就證明公司此時的經營狀況出現了問題。經濟管理學上定義了一種最小波動值來衡量這種情況:
當最小波動值越大時,就說明營業情況越不穩定。
而分析整個公司的從成立到現在營業情況是否穩定,只需要把每一天的最小波動值加起來就可以了。你的任務就是編寫乙個程式幫助tiger來計算這乙個值。
第一天的最小波動值為第一天的營業額。
該天的最小波動值=min。
輸入格式:
輸入由檔案』turnover.in』讀入。
第一行為正整數n(n<=32767) ,表示該公司從成立一直到現在的天數,接下來的n行每行有乙個整數ai(|ai|<=1000000) ,表示第i天公司的營業額,可能存在負數。
輸出格式:
輸入樣例#1:65
1254
6輸出樣例#1:
結果說明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12
太久沒打過了,就對著題解一頓打和理解,題意就是找前驅和後繼裡面和自己差的比較小的差值.
唉,我太菜了...
#includeusing namespace std;
const int maxn=40008;
struct sjtree[maxn];
int n,sum,root,flag;
void zig(int x)
tree[x].rc=y;
tree[y].fa=x;
}void zag(int x)
tree[x].lc=y;
tree[y].fa=x;
}inline void splay(int x) //將 x 這個點翻到 根的函式.
else
//到最後面即將翻到根的時候需要分類討論.
//zig-zig,zag-zag,zig-zag,zag-zig;
}root=x;
//最後面更新根.
}void build(int x,int rt)
//x為要插入的節點,rt為當前的節點.
if(tree[x].data>n;
cin>>tree[1].data;
root=1;sum+=tree[1].data;
for(int i=2;i<=n;i++)
cout
}
HNOI2002 營業額統計
花了一天鑽研了splay,然後發現splay沒我想象的那麼難 以前都是寫sbt來著 但是splay的速度確實沒那麼快,但是真的挺好寫的 我寫的版本測了這題以後又用了一下別人的splay,發現通過這題大多數splay在750ms上下,我是688ms,說明還算是不錯的啦 啦啦啦 include incl...
HNOI 2002 營業額統計
最近開始重新學習splay樹寫的第一題,基本就是照著別人部落格改的一道題,關於splay樹的模板,感覺大牛已經把 改得很短!這道題沒什麼難度,乙個插入操作,乙個找前驅,乙個找後驅的操作。話說這題有個資料有個bug的地方,可以看連線的discuss 因為沒有push down,push up的操作,感...
HNOI2002 營業額統計
傳送門 題目大意 求一段序列,小於當前元素的最大值和大於當前元素的最小值。從該元素前面的元素找。題解 建立線段樹維護或者使用雙向鍊錶.或stl水過 線段樹每次插入乙個新值,查詢大於它的最小值和小於它的最大值 雙向鍊錶有點神.我們知道排序後乙個數的前驅就是小於它的最大值 後繼就是大於它的最小值,我們將...