Cod sursa(job #396731)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 15 februarie 2010 19:47:24
Problema Tribute Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<stdio.h>
#include<string.h>
#define INF 2500000005
struct trib
{
    int x,y;
};
int n,dx,dy,st;
int maxv,dr;
int f[50001];
trib v[50001];
int di,s1=INF,s2=INF;
int main ()
{
    int i;
    freopen("tribute.in","r",stdin);
    freopen("tribute.out","w",stdout);
    scanf("%d%d%d",&n,&dx,&dy);
    dx++;dy++;
    for(i=1;i<=n;i++)
    {
        scanf("%d%d",&v[i].x,&v[i].y);
        f[v[i].x]++;
        if(v[i].x>=dx)
        {
            di+=v[i].x-dx+1;
            dr++;
        }
        if(v[i].x>maxv)
            maxv=v[i].x;
    }
    for(i=dx;i<=maxv;i++)
    {
        st+=f[i-dx];
        di=di+st-dr;
        if(di<s1)
            s1=di;
        dr-=f[i];
    }
    //////////////////////////////////////
    memset(f,0,sizeof(f));
    di=0;maxv=0;
    dr=st=0;
    for(i=1;i<=n;i++)
    {
        f[v[i].y]++;
        if(v[i].y>=dy)
        {
            di+=v[i].y-dy+1;
            dr++;
        }
        if(v[i].y>maxv)
            maxv=v[i].y;
    }
    
    for(i=dy;i<=maxv;i++)
    {
        st+=f[i-dy];
        di=di+st-dr;
        if(di<s2)
            s2=di;
        dr-=f[i];
    }
    printf("%d\n",s1+s2);
    return 0;
}