Cod sursa(job #2736971)

Utilizator LeCapataIustinian Serban LeCapata Data 4 aprilie 2021 11:37:42
Problema Tribute Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <algorithm>
#define N 50005
using namespace std;

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

struct baliere{
    long long sumStg[N], sumDrp[N];
    int cate[N];
}X, Y;

int n, dx, dy, minX = N, minY = N, maxX, maxY;
int fx[N], fy[N];

void creareSuma(baliere &A, int frecv[N], int minim, int maxim){

    A.cate[minim] = frecv[minim];
    for(int i =  minim + 1; i <= maxim; ++i){
        A.sumStg[i] = A.sumStg[i - 1] + A.cate[i - 1];
        A.cate[i] = A.cate[i - 1] + frecv[i];
    }
    A.cate[maxim] = frecv[maxim];
    for(int i = maxim - 1; i >= minim; --i){
        A.sumDrp[i] = A.sumDrp[i + 1] + A.cate[i + 1];
        A.cate[i] = A.cate[i + 1] + frecv[i];
    }
}

long long rezolv(baliere A, int minim, int maxim, int d){
    long long sol = (long long) N * N;
    for(int i = minim; i <= maxim; ++i)
        sol = min(sol, (A.sumStg[i] - A.sumStg[minim]) + (A.sumDrp[i + d] - A.sumDrp[maxim]));

    return sol;
}

int main()
{
    in>>n>>dx>>dy;

    for(int i = 1; i <= n; ++i){
        int x, y;
        in>>x>>y;
        fx[x]++; fy[y]++;

        minX = min(minX, x);
        minY = min(minY, y);

        maxX = max(maxX, x);
        maxY = max(maxY, y);
    }

    creareSuma(X, fx, minX, maxX);
    creareSuma(Y, fy, minY, maxY);

    out<<rezolv(X, minX, maxX, dx) + rezolv(Y, minY, maxY, dy);

    in.close();
    out.close();
    return 0;
}