Cod sursa(job #89028)

Utilizator stef2nStefan Istrate stef2n Data 5 octombrie 2007 13:20:37
Problema Tribute Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>

#define DMAX 50001

int N,DX,DY;
int cntX[DMAX],cntY[DMAX];
int left[DMAX],right[DMAX],up[DMAX],down[DMAX];

void read_data()
{
	int x,y;
	scanf("%d %d %d",&N,&DX,&DY);
	for(int i=0; i<N; i++)
	{
		scanf("%d %d",&x,&y);
		cntX[x]++;
		cntY[y]++;
	}
}

void init()
{
	int i;
	left[0]=0;
	for(i=1; i<DMAX; i++)
		left[i]=left[i-1]+cntX[i-1];
	right[DMAX-1]=0;
	for(i=DMAX-2; i>=0; i--)
		right[i]=right[i+1]+cntX[i+1];
	down[0]=0;
	for(i=1; i<DMAX; i++)
		down[i]=down[i-1]+cntY[i-1];
	up[DMAX-1]=0;
	for(i=DMAX-2; i>=0; i--)
		up[i]=up[i+1]+cntY[i+1];
}

int hcost() // horizontal min-cost
{
	int i, cost=0, mincost;
	for(i=DX; i<DMAX; i++)
		cost+=right[i];
	mincost=cost;
	for(i=1; i<=DMAX-DX; i++)
	{
		cost += left[i];
		cost -= right[i+DX-1];
		if(mincost>cost)
			mincost=cost;
	}
	return mincost;
}

int vcost() // vertical min-cost
{
	int i, cost=0, mincost;
	for(i=DY; i<DMAX; i++)
		cost+=up[i];
	mincost=cost;
	for(i=1; i<=DMAX-DY; i++)
	{
		cost += down[i];
		cost -= up[i+DY-1];
		if(mincost>cost)
			mincost=cost;
	}
	return mincost;
}


int main()
{
	freopen("tribute.in","r",stdin);
	freopen("tribute.out","w",stdout);
	read_data();
	init();
	printf("%d\n",hcost()+vcost());
	return 0;
}