Cod sursa(job #1393041)

Utilizator Ionut228Ionut Calofir Ionut228 Data 19 martie 2015 01:37:00
Problema Tribute Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;

ifstream fin("tribute.in");
ofstream fout("tribute.out");

const long long INF = (1LL << 60);

int N, DX, DY;
int maxx, maxy;
long long sp[50005], num[50005];
long long spinv[50005], numinv[50005];

struct puncte
{
    int x, y;
};
puncte V[50005];

long long solve_x()
{
    maxx = 0;

    for (int i = 1; i <= N; ++i)
    {
        ++num[V[i].x];
        ++numinv[V[i].x];
        maxx = max(maxx, V[i].x);
    }
    sp[0] = 0;
    for (int i = 1; i <= maxx; ++i)
    {
        sp[i] = sp[i - 1] + num[i - 1];
        num[i] += num[i - 1];
    }
    spinv[maxx] = 0;
    for (int i = maxx - 1; i >= 0; --i)
    {
        spinv[i] = spinv[i + 1] + numinv[i + 1];
        numinv[i] += numinv[i + 1];
    }

    long long best = INF;
    for (int i = 0; i + DX <= maxx; ++i)
        best = min(best, sp[i] + spinv[i + DX]);

    return best;
}

long long solve_y()
{
    memset(sp, 0, sizeof(sp));
    memset(num, 0, sizeof(num));
    memset(spinv, 0, sizeof(spinv));
    memset(numinv, 0, sizeof(numinv));

    maxy = 0;

    for (int i = 1; i <= N; ++i)
    {
        ++num[V[i].y];
        ++numinv[V[i].y];
        maxy = max(maxy, V[i].y);
    }
    sp[0] = 0;
    for (int i = 1; i <= maxy; ++i)
    {
        sp[i] = sp[i - 1] + num[i - 1];
        num[i] += num[i - 1];
    }
    spinv[maxy] = 0;
    for (int i = maxy - 1; i >= 0; --i)
    {
        spinv[i] = spinv[i + 1] + numinv[i + 1];
        numinv[i] += numinv[i + 1];
    }

    long long best = INF;
    for (int i = 0; i + DY <= maxy; ++i)
        best = min(best, sp[i] + spinv[i + DY]);

    return best;
}

int main()
{
    fin >> N >> DX >> DY;
    for (int i = 1; i <= N; ++i)
        fin >> V[i].x >> V[i].y;

    long long sol1 = solve_x();
    long long sol2 = solve_y();

    fout << sol1 + sol2 << '\n';

    fin.close();
    fout.close();
    return 0;
}