Cod sursa(job #263558)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 20 februarie 2009 16:21:23
Problema Tribute Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>

int N, DX, DY, rez;
int st[50005], dr[50005], f[50005], nr[50005];

struct punct
{
	int x, y;
} v[505];

int min(int x, int y) { return x < y ? x : y;}

int main()
{
	freopen("tribute.in","r",stdin);
	freopen("tribute.out","w",stdout);


	int i, j;
	scanf("%d %d %d",&N, &DX, &DY);

	for (i = 1; i <= N; i++) scanf("%d %d",&v[i].x, &v[i].y);

// caut pt DX

	for (i = 1; i <= N; i++) f[ v[i].x ]++;
	nr[0] = f[0];
	for (i = 1; i <= 50000; i++) nr[i] = nr[i - 1] + f[i];
		

	for (i = 1; i <= 50000; i++)
	{
		j = 50000 - i;
		st[i] = st[i - 1] + nr[i - 1];
		dr[j] = dr[j + 1] + (N - nr[j + 1]);
	}

	int m = (1<<30);
	for (i = 0; i <= 50000 - DX + 1; i++) m = min(st[i] + dr[i + DX - 1], m);

	rez += m;

// caut pt DY

	for (i = 0; i <= 50000; i++) f[i] = nr[i] = 0;

	for (i = 1; i <= N; i++) f[ v[i].y ]++;
	nr[0] = f[0];
	for (i = 1; i <= 50000; i++) nr[i] = nr[i - 1] + f[i];
		

	for (i = 1; i <= 50000; i++)
	{
		j = 50000 - i;
		st[i] = st[i - 1] + nr[i - 1];
		dr[j] = dr[j + 1] + (N - nr[j + 1]);
	}

	m = (1<<30);
	for (i = 0; i <= 50000 - DY + 1; i++) m = min(st[i] + dr[i + DY - 1], m);

	rez += m;

	printf("%d\n",rez);
	return 0;
}