Cod sursa(job #123516)

Utilizator gicagica popescu gica Data 16 ianuarie 2008 12:29:20
Problema Tribute Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>
#include <stdlib.h>

int n,dx,dy,a[50100],b[50100],c[50100],d[50100],max,min1,min2,max2;

int cmp (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}

int main()
{
	freopen("tribute.in","r",stdin);
	freopen("tribute.out","w",stdout);
	scanf("%d %d %d",&n,&dx,&dy);
	int i,j;
	for (i=1; i<=n; ++i) 
	{
		scanf("%d%d",&a[i],&b[i]);
		if (max<a[i]) max=a[i];
		if (max2<b[i]) max2=b[i];
	}
	if (max<dx) max=dx;
	if (max2<dy) max2=dy;
	qsort(a+1,n,sizeof(int),cmp);
	qsort(b+1,n,sizeof(int),cmp);
	j=0;
	b[n+1]=100000;
	for (i=1; i<=max2; ++i) 
	{
		while (b[j+1]<i) ++j;
		c[i]=c[i-1]+j;
	}
	j=n+1;
	for (i=max2; i>=0; --i)
	{
		while (b[j-1]>i) --j;
		d[i]=d[i+1]+(n-j+1);
	}
	min1=2000000000;
	for (i=0; i<=max2-dy+1; ++i) 
	{
		if (min1>c[i]+d[i+dy]) min1=c[i]+d[i+dy];
    }
	for (i=0; i<=max2; ++i ) 
	{
		c[i]=0;
		d[i]=0;
	}
	j=0;
	a[n+1]=100000;
	for (i=1; i<=max; ++i) 
	{
		while (a[j+1]<i) ++j;
		c[i]=c[i-1]+j;
	}
	j=n+1;
	for (i=max; i>=0; --i) 
	{
		while (a[j-1]>i) --j;
		d[i]=d[i+1]+(n-j+1);
	}
	min2=2000000000;
	for (i=0; i<=max-dx+1; ++i) 
	{
		if (min2>c[i]+d[i+dx]) min2=c[i]+d[i+dx];
	}
	printf("%d\n",min1+min2);
	return 0;
}