[三元組]題解

題目描述:

      給出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

      那麼,D(Ta,Tb)=(|a-b|+|a-c|+|b-c|)/2,其中,a=Ia−Ib,b=Ja−Jb,c=Ka−Kb.

      以|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

轉載請註明出處

發佈了45 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章