Pagini recente » Cod sursa (job #820914) | Cod sursa (job #1699085) | Cod sursa (job #1132495) | Solutii preONI 2007, Runda 1 | Cod sursa (job #122753)
Cod sursa(job #122753)
#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);
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;
}