[bzoj1588][hnoi2002]營業額統計
試題描述
營業額統計 tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。 tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一定的波動,當然一定的波動是能夠接受的,但是在某些時候營業額突變得很高或是很低,這就證明公司此時的經營狀況出現了問題。經濟管理學上定義了一種最小波動值來衡量這種情況: 該天的最小波動值 當最小波動值越大時,就說明營業情況越不穩定。 而分析整個公司的從成立到現在營業情況是否穩定,只需要把每一天的最小波動值加起來就可以了。你的任務就是編寫乙個程式幫助tiger來計算這乙個值。 第一天的最小波動值為第一天的營業額。 輸入輸出要求
輸入
第一行為正整數 ,表示該公司從成立一直到現在的天數,接下來的n行每行有乙個整數(有可能有負數) ,表示第i天公司的營業額。
輸出
輸出檔案僅有乙個正整數,即sigma(每天最小的波動值) 。結果小於2^31 。
輸入示例
6512546
輸出示例
12
資料規模及約定
n ≤ 50000
題解
簡單的平衡樹操作。
#include #include #include #include #include #include #include using namespace std;int read()
while(isdigit(c))
return x * f;
}#define maxn 50010
#define oo 2147483647
struct node
node(int _, int __): v(_), r(__) {}
} ns[maxn];
int tot, rt, ch[2][maxn], fa[maxn];
void maintain(int o)
void rotate(int u)
void insert(int& o, int v)
bool d = v > ns[o].v;
insert(ch[d][o], v); fa[ch[d][o]] = o;
if(ns[ch[d][o]].r > ns[o].r)
return maintain(o);
}int fans;
void find(int o, int v)
fans = min(fans, abs(v - ns[o].v));
for(int i = 0; i < 2; i++) if(ch[i][o])
fans = min(fans, min(abs(v - ns[ch[i][o]].minv), abs(v - ns[ch[i][o]].maxv)));
bool d = v > ns[o].v;
find(ch[d][o], v);
return ;
}int main()
printf("%d\n", ans);
return 0;
}
bzoj1588 HNOI2002 營業額統計
給出n個數,求每個數和它前面每個數的差值絕對值的最小值之和。n 32767 很顯然求前驅後驅。可以離散化後用權值線段樹二分找。也可以直接用splay找。或者還可以離線排完序用雙向鍊錶找。你喜歡就好嘍。orz bzoj上rank1 0ms踩所有人 include include include def...
BZOJ 1588 HNOI2002 營業額統計
description 營業額統計 tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一...
BZOJ 1588 HNOI2002 營業額統計
treap的入門題,雖然在splay的 裡看到過這題。遇到2個奇葩問題 1 bzoj 上用srand time null 會re 2 這題的資料不完整 time limit 5 sec memory limit 162 mb submit 6820 solved 2250 submit status...