Cod sursa(job #489080)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 30 septembrie 2010 21:31:01
Problema Tribute Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <stdio.h>

int v[2][50001],n,dx,dy,minx,miny,bef,aft,s;

void quicksort(int l,int r,int z)
{
	int i=l,j=r,aux,mid=v[z][(l+r)/2];
	while (i <= j)
	{
		while (v[z][i]<mid) i++;
		while (v[z][j]>mid) j--;
		if (i <= j)
		{
			aux=v[z][i];v[z][i]=v[z][j];v[z][j]=aux;
			aux=v[1-z][i];v[1-z][i]=v[1-z][j];v[1-z][j]=aux;
			i++;
			j--;
		}
	}
	if (l<j) quicksort(l,j,z);
	if (i<r) quicksort(i,r,z);
}

int main()
{
	int l,r,i;
	minx=625000000;miny=625000000;
	freopen("tribute.in","r",stdin);
	freopen("tribute.out","w",stdout);
	scanf("%d%d%d",&n,&dx,&dy);
	for (i=1;i<=n;i++) scanf("%d%d",&v[0][i],&v[1][i]);
	++dx;++dy;
	quicksort(1,n,0);
	bef=0;aft=1;
	l=v[0][1];r=l+dx-1;
 	while (v[0][aft]<=r) ++aft;
	for (i=aft;i<=n;i++) s+=v[0][i]-r;
	while (r<v[0][n])
	{
	    ++l;++r;
	    s+=bef;
	    s=s-n+aft-1;
	    while (v[0][bef+1]<l) {++bef;++s;}
	    while ((v[0][aft]<=r)&&(aft<n)) ++aft;
	    if (s<minx) minx=s;
	}
	if (s<minx) minx=s;
    quicksort(1,n,1);
	bef=0;aft=1;s=0;
	l=v[1][1];r=l+dy-1;
	while (v[1][aft]<=r) ++aft;
	for (i=aft;i<=n;i++) s+=v[1][i]-r;
	while (r<v[1][n])
	{
	    ++l;++r;
	    s+=bef;
	    s=s-n+aft-1;
	    while (v[1][bef+1]<l) {++bef;++s;}
	    while ((v[1][aft]<=r)&&(aft<n)) ++aft;
	    if (s<miny) miny=s;
	}
	if (s<miny) miny=s;
	printf("%d",minx+miny);
	return 0;
}