Pagini recente » Cod sursa (job #1099979) | Cod sursa (job #2024328) | Cod sursa (job #2616253) | Cod sursa (job #2679059) | Cod sursa (job #2736971)
#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;
}