Cod sursa(job #971989)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 10 iulie 2013 19:14:58
Problema Tribute Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb

#include <cstdio>
#include <utility>
#include <algorithm>

typedef std::pair<int,int> Point;

const int MAX_N(50001);
const int MAX_SIZE(50011);

int n, Dx, Dy;
Point v [MAX_N];
int Dpx [2] [MAX_SIZE];
int Dpy [2] [MAX_SIZE];
int Optimal;

inline void Read (void)
{
	std::freopen("tribute.in","r",stdin);
	std::scanf("%d %d %d",&n,&Dx,&Dy);
	for (int i(1) ; i <= n ; ++i)
	{
		std::scanf("%d %d",&v[i].first,&v[i].second);
		++v[i].first;
		++v[i].second;
	}
	std::fclose(stdin);
}

inline void Print (void)
{
	std::freopen("tribute.out","w",stdout);
	std::printf("%d\n",Optimal);
	std::fclose(stdout);
}

inline void Dynamic (void)
{
	int i, a, b;
	for (i = 1 ; i <= n ; ++i)
	{
		++Dpx[0][v[i].first];
		++Dpx[1][v[i].first];
		++Dpy[0][v[i].second];
		++Dpy[1][v[i].second];
	}
	a = b = 0;
	for (i = 1 ; i < MAX_SIZE ; ++i)
	{
		a += Dpx[0][i];
		b += Dpy[0][i];
		Dpx[0][i] = Dpx[0][i - 1] + a;
		Dpy[0][i] = Dpy[0][i - 1] + b;
	}
	a = b = 0;
	for (i = MAX_SIZE - 2 ; i ; --i)
	{
		a += Dpx[1][i];
		b += Dpy[1][i];
		Dpx[1][i] = Dpx[1][i + 1] + a;
		Dpy[1][i] = Dpy[1][i + 1] + b;
	}
	int sol(1 << 30);
	for (i = 1 ; i < MAX_SIZE - Dx ; ++i)
		sol = std::min(sol,Dpx[0][i - 1] + Dpx[1][i + Dx + 1]);
	Optimal += sol;
	sol = 1 << 30;
	for (i = 1 ; i < MAX_SIZE - Dy ; ++i)
		sol = std::min(sol,Dpy[0][i - 1] + Dpy[1][i + Dy + 1]);
	Optimal += sol;
}

int main (void)
{
	Read();
	Dynamic();
	Print();
	return 0;
}