题目描述:
给出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
转载请注明出处