Cod sursa(job #3338631)

Utilizator serbanbBrindescu Serban serbanb Data 4 februarie 2026 12:53:08
Problema Tribute Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>

using namespace std;

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

int xcoord[50005];
int ycoord[50005];

int n,dx,dy;

void read()
{
    fin >> n >> dx >> dy;
    for(int i = 0; i < n; ++i){
        int x,y;
        fin >> x >> y;
        ++xcoord[x];
        ++ycoord[y];
    }
}

int findxdist()
{
    int nl = 0, nr = 0, sum = 0;
    for(int i = dx + 1; i <= 50000; ++i){
        if(xcoord[i] > 0){
            sum += xcoord[i] * (i - dx);
            nr += xcoord[i];
        }
    }
    int minSum = sum;
    for(int i = dx + 1; i <= 50000; ++i){
        sum += nl;
        sum -= nr;
        if(xcoord[i - dx - 1] > 0){
            nl += xcoord[i - dx - 1];
            sum += xcoord[i - dx - 1];
        }
        if(xcoord[i] > 0){
            nr -= xcoord[i];
        }
        if(sum < minSum){
            minSum = sum;
        }
    }
    return minSum;
}

int findydist()
{
    int nl = 0, nr = 0, sum = 0;
    for(int i = dy + 1; i <= 50000; ++i){
        if(ycoord[i] > 0){
            sum += ycoord[i] * (i - dy);
            nr += ycoord[i];
        }
    }
    int minSum = sum;
    for(int i = dy + 1; i <= 50000; ++i){
        sum += nl;
        sum -= nr;
        if(ycoord[i - dy - 1] > 0){
            nl += ycoord[i - dy - 1];
            sum += ycoord[i - dy - 1];
        }
        if(ycoord[i] > 0){
            nr -= ycoord[i];
        }
        if(sum < minSum){
            minSum = sum;
        }
    }
    return minSum;
}

int main()
{
    read();
    fout << findxdist() + findydist();
    return 0;
}