Cod sursa(job #125466)

Utilizator coderninuHasna Robert coderninu Data 20 ianuarie 2008 12:57:53
Problema Inundatii Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 10-a Marime 1.36 kb
#include <stdio.h>
#define Nmax 50001


struct nod { long x, y, z; } p[Nmax];

long n, i;
long long avgx, avgy, avgz, rez, xx, yy, zz;


inline long abs(long x) { return x<0?-x:x; }

long binx(long P, long Q)
{
	long m=(P+Q)/2;
	if (P+1==Q) return abs(p[P].x-avgx)<abs(p[Q].x-avgx)?P:Q;
	if (p[m].x < avgx) return binx(P,m);
	else return binx(m,Q);
}

long biny(long P, long Q)
{
	long m=(P+Q)/2;
	if (P+1==Q) return abs(p[P].y-avgy)<abs(p[Q].y-avgy)?P:Q;
	if (p[m].y < avgy) return biny(P,m);
	else return biny(m,Q);
}

long binz(long P, long Q)
{
	long m=(P+Q)/2;
	if (P+1==Q) return abs(p[P].z-avgz)<abs(p[Q].z-avgz)?P:Q;
	if (p[m].z < avgz) return binz(P,m);
	else return binz(m,Q);
}


int main()
{
	freopen("inundatii.in", "r", stdin);
	scanf("%ld", &n);
	for (i=1; i<=n; i++) scanf("%ld %ld %ld\n", &p[i].x, &p[i].y, &p[i].z);
	fclose(stdin);
	freopen("inundatii.out", "w", stdout);
	if (n==2) printf("%ld\n", abs(p[1].x-p[2].x)+abs(p[1].y-p[2].y)+abs(p[1].z-p[2].z)+3);
	else
	{
		for (i=1; i<=n; i++) { avgx+=p[i].x; avgy+=p[i].y; avgz+=p[i].z; }
		avgx/=n; avgy/=n; avgz/=n;
		xx=binx(1,n); yy=biny(1,n); zz=binz(1,n);

		for (i=1; i<=n; i++)
		{
			rez+=abs(p[i].x-(p[xx].x-xx+i));
			rez+=abs(p[i].y-(p[yy].y-yy+i));
			rez+=abs(p[i].z-(p[zz].z-zz+i));
		}


		printf("%ld\n", rez);
	}

	fclose(stdout);
	return 0;
}