題目描述:
給出n個形如(i,j,k)的三元組
定義一組三元組之間的差爲:
D(Ta, Tb) = max{Ia−Ib, Ja−Jb, Ka−Kb}−min{Ia−Ib, Ja−Jb, Ka−Kb}
求所有對三元組的差的總和(算了D(Ta, Tb)就不用算D(Tb, Ta)了)
數據範圍:
n<=500000
時限1s
[題解]
首先,對任意三元組(a,b,c)我們有:max(a,b,c)-min(a,b,c)=(|a-b|+|a-c|+|b-c|)/2
以|a-b|爲例.a-b=(Ia−Ib)-(Ja−Jb)=(Ia-Ja)-(Ja-Jb).
令x=Ia-Ja,Y=Ja-Ka,Z=Ka-Ia,則:D(Ta,Tb)=(|x1-x2|+|y1-y2|+|z1-z2|)/2
分別對x,y,z進行考慮.對一個xi,若他比xj大,則他對最後的差的貢獻爲xi,否則爲-xi.
到這裏,算法就很明顯了:分別對x,y,z從小到大排序,對每個xi,他對最後答案的貢獻是:xi*(i-(n-i+1)),yi和zi也是一樣的.由於每對差都算了兩次,所以最後要將答案除以2.
因爲當時敲代碼時非常nc,搞出3個快排,代碼奇醜.所以就不貼代碼了.其實由於對3個數組的操作是一樣的,所以直接用一個指針就行了.
BY QW
轉載請註明出處