Cod sursa(job #819055)

Utilizator visanrVisan Radu visanr Data 18 noiembrie 2012 14:34:50
Problema Tribute Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
using namespace std;


#define inf 0x3f3f3f3f
#define nmax 50010

int apX[nmax + 10], apY[nmax + 10], cnt[nmax + 10], V1[nmax + 10], V2[nmax + 10];
int N, X, Y, i, DX, DY;
int ans;

int main()
{
    freopen("tribute.in", "r", stdin);
    freopen("tribute.out", "w", stdout);
    scanf("%i %i %i", &N, &DX, &DY);
    for(i = 1; i <= N; i++)
    {
        scanf("%i %i", &X, &Y);
        apX[X] ++;
        apY[Y] ++;
    }
    for(i = 0; i < nmax; i++)
    {
        V1[i] = V1[i - 1] + cnt[i - 1];
        cnt[i] = cnt[i - 1] + apX[i];
    }
    memset(cnt, 0, sizeof(cnt));
    for(i = nmax - 1; i >= 0; i--)
    {
        V2[i] = V2[i + 1] + cnt[i + 1];
        cnt[i] = cnt[i+1] + apX[i];
    }
    int minn = inf;
    for(i = 0; i < nmax; i++)
        if(i + DX < nmax)
            minn = min(minn, V1[i] + V2[i + DX]);
    ans = minn;
    memset(cnt, 0, sizeof(cnt));
    memset(V1, 0, sizeof(V1));
    memset(V2, 0, sizeof(V2));
    for(i = 0; i < nmax; i++)
    {
        V1[i] = V1[i - 1] + cnt[i - 1];
        cnt[i] = cnt[i - 1] + apY[i];
    }
    memset(cnt, 0, sizeof(cnt));
    for(i = nmax - 1; i >= 0; i--)
    {
        V2[i] = V2[i + 1] + cnt[i + 1];
        cnt[i] = cnt[i + 1] + apY[i];
    }
    minn = inf;
    for(i = 0; i < nmax; i++)
        if(i + DY < nmax)
            minn = min(minn, V1[i] + V2[i + DY]);
    ans += minn;
    printf("%i\n", ans);
    return 0;
}