Pagini recente » Cod sursa (job #539135) | Cod sursa (job #1255613) | Cod sursa (job #70206) | Cod sursa (job #2169584) | Cod sursa (job #789495)
Cod sursa(job #789495)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fi("tribute.in");
ofstream fo("tribute.out");
#define MAXN 50010
int N, DX, DY;
int X[MAXN + 1], Y[MAXN + 1];
int SXL[MAXN + 1], SYL[MAXN + 1];
int SXR[MAXN + 1], SYR[MAXN + 1];
void print(int *v, int n)
{
for(int i = 0; i < n; i++)
cout << v[i] << " ";
cout << endl;
}
void compute_left(int *X, int *SX)
{
int *NX = new int[MAXN + 1];
for(int i = 0; i <= MAXN; i++)
NX[i] = X[i];
for(int i = 0; i < MAXN; i++)
NX[i + 1] += NX[i];
SX[0] = 0;
for(int i = 1; i <= MAXN; i++)
SX[i] = SX[i - 1] + NX[i - 1];
delete NX;
// print(SX, 6);
}
void compute_right(int *X, int *SX)
{
int *NX = new int[MAXN + 1];
for(int i = 0; i <= MAXN; i++)
NX[i] = X[i];
for(int i = MAXN; i > 0; i--)
NX[i - 1] += NX[i];
SX[MAXN] = 0;
for(int i = MAXN - 1; i >= 0; i--)
SX[i] = SX[i + 1] + NX[i + 1];
delete NX;
// print(SX, 6);
}
void read()
{
fi >> N >> DX >> DY;
for(int i = 0; i <= MAXN; i++)
X[i] = Y[i] = 0;
for(int i = 0; i < N; i++)
{
int x, y;
fi >> x >> y;
X[x]++;
Y[y]++;
}
compute_left(X, SXL);
compute_left(Y, SYL);
compute_right(X, SXR);
compute_right(Y, SYR);
}
int solve(int *SL, int *SR, int D)
{
int cost_min = 1 << 30;
for(int i = 0; i <= MAXN - D; i++)
{
// i fixeaza capatul din stanga
// j capatul din dreapta
int j = i + D;
int cost = SL[i] + SR[j];
cost_min = min(cost_min, cost);
}
return cost_min;
}
int main(int argc, char *argv[])
{
read();
fo << (solve(SXL, SXR, DX) + solve(SYL, SYR, DY))
<< endl;
return 0;
}