Cod sursa(job #122761)

Utilizator raduzerRadu Zernoveanu raduzer Data 13 ianuarie 2008 17:13:22
Problema Tribute Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 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];
	}
	qsort(a+1,n,sizeof(int),cmp);
	qsort(b+1,n,sizeof(int),cmp);
	for (i=1; i<n; ++i)
		if (a[i]>a[i+1]) for (j=1; j<=2000000000; ++j) max=1;
	for (i=1; i<n; ++i)
		if (b[i]>b[i+1]) for (j=1; j<=2000000000; ++j) max=1;
	j=0;
	b[n+1]=100000;
	for (i=1; i<=max; ++i) 
	{
		while (b[j+1]<i) ++j;
		c[i]=c[i-1]+j;
	}
	j=n+1;
	for (i=max; i>=0; --i)
	{
		while (b[j-1]>i) --j;
		d[i]=d[i+1]+(n-j+1);
	}
	min1=2000000000;
	for (i=0; i<=max; ++i) 
	{
		if (min1>c[i]+d[i+dy]) min1=c[i]+d[i+dy];
    }
	for (i=0; i<=max; ++i ) 
	{
		c[i]=0;
		d[i]=0;
	}
	j=0;
	a[n+1]=100000;
	for (i=1; i<=max2; ++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; ++i) 
	{
		if (min2>c[i]+d[i+dx]) min2=c[i]+d[i+dx];
	}
	printf("%d\n",min1+min2);
	return 0;
}