【題意】
給出n個數,每個數都有乙個波動值,是對於前面每個數的差的絕對值的最小值。第乙個數的波動值就是其本身。求n個數的最小波動值之和。
n<=32767
【思路】
將元素排序後做成鍊錶,用to[i]表示i在排序後的位置。從最後一天開始計算,找到它在鍊錶中的位置,其值為xval,其鍊錶左邊的值為lval,其鍊錶右邊的值為rval,由於排序過所以一定滿足lval小於xval小於rval,其波動值為min( abs(xval-lval) , abs(xval-rval) )。因為它是原序列最後乙個元素,所以鍊錶上所有其它元素都在原序列的它的前面,可以與它計算波動值。
那麼我們計算倒數第二個元素的時候,就不能與最後乙個元素計算波動值了,所以計算完乙個元素的波動值後,將其從鍊錶中刪去,這樣每次計算乙個元素時,鍊錶內其他元素都是可以與其計算波動值的(雖然實際上有用的只是它的兩邊兩個元素)。
【**】
#include
#include
#include
#include
#include
#define maxn 51000
#define inf 999999999
using
namespace
std;
inline
int read()
while(x>='0'&&x<='9')
return ans*f;
}struct node
}a[maxn];
bool cmp(node x,node y)
int main()
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
for(int i=n;i>=1;i--)
ans+=min( abs(a[x].val-a[nex[x]].val) , abs(a[x].val-a[pre[x]].val) );
del(x);
}printf("%d\n",ans);
return
0;}
營業額統計
給出乙個 n 個數的數列,定義 f i min i ge j 求 sum f i 題目就要我們求在這個數之前並且和這個數的差最小的數,我們考慮這個數必定出現在當前 a i 的前驅或後繼中。所以我們可以用平衡樹維護這個數列,每次求一下前驅和後繼,注意這裡可以相等,再把原數插入進去即可。includeu...
營業額統計 Treap
tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一定的波動,當然一定的波動是能夠接受的...
treap 營業額統計
tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一定的波動,當然一定的波動是能夠接受的...