Cod sursa(job #1393039)

Utilizator Ionut228Ionut Calofir Ionut228 Data 19 martie 2015 01:35:31
Problema Tribute Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;

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

const int INF = 0x3f3f3f3f;

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];

int 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];
    }

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

    return best;
}

int 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];
    }

    int 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;

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

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

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