您的位置:首页 > Web前端

poj3244 Difference between Triplets

2014-10-28 22:18 106 查看
题意:<=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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: