Pagini recente » Cod sursa (job #562227) | Cod sursa (job #310364) | Cod sursa (job #1524964) | Cod sursa (job #797155) | Cod sursa (job #174589)
Cod sursa(job #174589)
#include <stdio.h>
#define INF (long long)(1<<30)*(long long)(1<<30)
#define MAXN (1 << 16)
#define MAXCOORD 50000
#define min(a,b) ((a) < (b) ? (a) : (b))
typedef long long llong;
int N, DX, DY, P[MAXN][2];
llong up[MAXN], down[MAXN], left[MAXN], right[MAXN];
int cntx[MAXN], cnty[MAXN];
llong res = INF;
void solve(void)
{
int i;
llong best = INF;
for(i = 1; i <= N; i++)
cntx[P[i][0]]++, cnty[P[i][1]]++;
for(i = 1; i <= MAXCOORD; i++)
cntx[i] += cntx[i-1], cnty[i] += cnty[i-1];
for(i = 1; i <= MAXCOORD; i++)
left[i] = left[i-1]+cntx[i-1],
down[i] = down[i-1]+cnty[i-1];
for(i = MAXCOORD; i >= 1; i--)
cntx[i] -= cntx[i-1], cnty[i] -= cnty[i-1],
cntx[i] += cntx[i+1], cnty[i] += cnty[i+1];
for(i = MAXCOORD; i >= 0; i--)
right[i] = right[i+1]+cntx[i+1],
up[i] = up[i+1]+cnty[i+1];
for(i = 0; i <= MAXCOORD-DY; i++)
best = min(best, down[i]+up[i+DY]);
for(i = DX; i <= MAXCOORD; i++)
res = min(res, best+left[i-DX]+right[i]);
}
void read_data(void)
{
int i;
scanf("%d %d %d\n", &N, &DX, &DY);
for(i = 1; i <= N; i++)
scanf("%d %d\n", &P[i][0], &P[i][1]);
}
void write_data(void)
{
printf("%lld\n", res);
}
int main(void)
{
freopen("tribute.in", "rt", stdin);
freopen("tribute.out", "wt", stdout);
read_data();
solve();
write_data();
return 0;
}