题意:<=200000个三元组(xi,yi,zi) 。
定义D(I,J)=max{xi-xj,yi-yj,zi-zj}-min{xi-xj,yi-yj,zi-zj}
求任意两个三元组的差的和。
思路:数轴上max(a,b,c)-min(a,b,c)=(|a-b|+|b-c|+|c-a|)/2(显然:任两点距离之和除以2倍)
那么 d[i][j]=( |x[i]-x[j]| + |y[i]-y[j]| + |z[i]-z[j]| )/2。
令a,b,c为x,y,z间的差值,于是发现a,b,c相互独立 可单独计算。
将a,b,c分别排序 ,小的被大的减,大的被前面小的加,那么第i个数被加i-1次,被减n-i次
LL a[200010],b[200010],c[200010];
int main()
{
int n;LL s;
int i,j;
int x,y,z;
while(~scanf("%d",&n) )
{
s=0;
if(n==0) break;
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&z);
a[i]=x-y;b[i]=y-z;c[i]=z-x;
}
sort(a+1,a+1+n);
sort(b+1,b+1+n);
sort(c+1,c+1+n);
for(i=1;i<=n;i++)
{
s+=(a[i]+b[i]+c[i])*(2*i-n-1);
}
printf("%lld\n",s/2);
}
return 0;
}
poj3244 Difference between Triplets
最新推荐文章于 2021-04-11 19:27:34 发布
本文介绍了一种计算200,000个三元组间差值总和的方法。通过定义D(I,J),利用max和min函数转换为两两元素差值的求和问题,并通过排序和计算技巧简化计算过程。

746

被折叠的 条评论
为什么被折叠?



