題目描述 description
tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。
tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一定的波動,當然一定的波動是能夠接受的,但是在某些時候營業額突變得很高或是很低,這就證明公司此時的經營狀況出現了問題。經濟管理學上定義了一種最小波動值來衡量這種情況:
該天的最小波動值 = mi
n|該天
以前某一
天的營業
額−該天
營業額|
當最小波動值越大時,就說明營業情況越不穩定。
而分析整個公司的從成立到現在營業情況是否穩定,只需要把每一天的最小波動值加起來就可以了。你的任務就是編寫乙個程式幫助tiger來計算這乙個值。
第一天的最小波動值為第一天的營業額。
輸入描述 input description
第一行為正整數n(
n<=
32767
) ,表示該公司從成立一直到現在的天數,接下來的
n 行每行有乙個正整數ai
(ai<=
1000000
),表示第
i 天公司的營業額。
輸出描述 output description
輸出檔案僅有乙個正整數,即每天最小波動值之和,小於231
樣例輸入 sample input
651
2546
樣例輸出 sample output12
資料範圍及提示 data size & hint
結果說明:5+
|1−5
|+|2
−1|+
|5−5
|+|4
−5|+
|6−5
|=5+
4+1+
0+1+
1=12
題解很顯然,這道題是一道衤果的splay樹。
手寫splay:
#include
#define maxn 50005
#define inf 1e8
using
namespace
std;
int min(int a, int b)
intabs(int x)
struct splay_tree
inline
void rotate(int x)
inline
void splay(int x, int p = 0)
else}}
if(!p) root = x;
}inline
void insert(int a)
int x = root, y;
while(x)
++n;
if(a < val[y])
else
}inline
int at(int loc)
inline
int last(int loc)
splay(y);
return y;
}y = fa[x];
while(y && x == ch[y][0])
splay(y);
return y;
}inline
int next(int loc)
splay(y);
return y;
}y = fa[x];
while(y && x == ch[y][1])
splay(y);
return y;
}inline
int find_lower_bound(int key)
}if(val[y] < key)
return next(y);
splay(y);
return y;
}};splay_tree tree;
int main()
cout
<< ans;
return
0;}
stl模板(stl)**好!
**:
據說智商達到180的人才會看到哦~,語文老師告訴我這叫留給讀者想象的空間~ code vs 1743 反轉卡片(splay)
時間限制 2 s 空間限制 256000 kb 題目等級 大師 master 題解 檢視執行結果 dzy493941464 yywyzdzr原創 小a將n張卡片整齊地排成一排,其中每張卡片上寫了1 n的乙個整數,每張卡片上的數各不相同。比如下圖是n 5的一種情況 3 4 2 1 5 接下來你需要按小...
Codevs 1743 反轉卡片 splay
1743 反轉卡片 時間限制 2 s 空間限制 256000 kb 題目等級 大師 master 題目描述 description dzy493941464 yywyzdzr原創 小a將n張卡片整齊地排成一排,其中每張卡片上寫了1 n的乙個整數,每張卡片上的數各不相同。比如下圖是n 5的一種情況 3...
平衡樹一 Splay樹
rt totfa i chival i cnt i size i 根節點編號 節點個數 父親左右兒子編號 節點權值 權值出現次數 子樹大小 maintain x 在改變節點位置後,將節點x的size更新 get x 判斷節點x是父親節點的左孩子還是右孩子 clear x 銷毀節點x void mai...