Cod sursa(job #174589)

Utilizator astronomyAirinei Adrian astronomy Data 8 aprilie 2008 23:52:14
Problema Tribute Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <stdio.h>

#define INF (long long)(1<<30)*(long long)(1<<30)
#define MAXN (1 << 16)
#define MAXCOORD 50000
#define min(a,b) ((a) < (b) ? (a) : (b))

typedef long long llong;

int N, DX, DY, P[MAXN][2];

llong up[MAXN], down[MAXN], left[MAXN], right[MAXN];
int cntx[MAXN], cnty[MAXN];

llong res = INF;

void solve(void)
{
    int i;
    llong best = INF;

    for(i = 1; i <= N; i++)
        cntx[P[i][0]]++, cnty[P[i][1]]++;

    for(i = 1; i <= MAXCOORD; i++)
        cntx[i] += cntx[i-1], cnty[i] += cnty[i-1];

    for(i = 1; i <= MAXCOORD; i++)
        left[i] = left[i-1]+cntx[i-1],
        down[i] = down[i-1]+cnty[i-1];

    for(i = MAXCOORD; i >= 1; i--)
        cntx[i] -= cntx[i-1], cnty[i] -= cnty[i-1],
        cntx[i] += cntx[i+1], cnty[i] += cnty[i+1];
        
    for(i = MAXCOORD; i >= 0; i--)
        right[i] = right[i+1]+cntx[i+1],
        up[i] = up[i+1]+cnty[i+1];

    for(i = 0; i <= MAXCOORD-DY; i++)
        best = min(best, down[i]+up[i+DY]);

    for(i = DX; i <= MAXCOORD; i++)
        res = min(res, best+left[i-DX]+right[i]);
}

void read_data(void)
{
    int i;
    scanf("%d %d %d\n", &N, &DX, &DY);

    for(i = 1; i <= N; i++)
        scanf("%d %d\n", &P[i][0], &P[i][1]);
}

void write_data(void)
{
    printf("%lld\n", res);
}

int main(void)
{
    freopen("tribute.in", "rt", stdin);
    freopen("tribute.out", "wt", stdout);

    read_data();
    solve();
    write_data();

    return 0;
}