[三元组]题解

这篇博客介绍了如何求解一组三元组之间的差值总和问题。通过转化,将最大值减最小值转化为绝对值的和,然后对每个维度进行排序并计算贡献。博主分享了算法思路,但未提供具体代码,强调了可以使用一个指针简化操作。
摘要由CSDN通过智能技术生成

题目描述:

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

转载请注明出处

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值