Pagini recente » Cod sursa (job #644217) | Cod sursa (job #310312) | Cod sursa (job #1168694) | Cod sursa (job #3273987) | Cod sursa (job #1393039)
#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;
}