题意:<=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 发布