记录编号 38449 评测结果 AAAAAA
题目名称 圣诞节 最终得分 100
用户昵称 Gravatarfeng 是否通过 通过
代码语言 C++ 运行时间 0.898 s
提交时间 2012-04-19 08:17:14 内存使用 9.02 MiB
显示代码纯文本
#include<fstream>
#include<memory.h>
#include<stdlib.h>
#include<algorithm>
#define MAXN 501
using namespace std;
int Mat[MAXN],Used[MAXN];
int map[1010][1010],mapa[1010][1010];
int a[250000];
int boyh[501],boya[510],girlh[510],girla[510];
int d[1010]={-1};
int n,m,i,j,k,l,r,mid;
int X;
bool v[510];
bool cross(int k) 
{     
	int v;     
	for(int i=1;i<=n;i++)     
	{         
		if(map[k][i]>X) 
			continue;         
		if(Used[i]) continue;         
		Used[i]=1;         
		if(!Mat[i] || cross(Mat[i]))         
		{             
			Mat[i]=k;             
			return true;         
		}     
	}
	return false; 
}
bool cmp(int a,int b)
{
	return a<b;
}
/*void sort(int l,int r) 
{     
	int i=l,j=r,x=sa[i+j>>1],y;     
	while (i<=j)     
	{         
		while (zt[x]>zt[sa[i]]||(zt[x]==zt[sa[i]]&&ud[x]>ud[sa[i]])) i++;         
		while (zt[x]<zt[sa[j]]||(zt[x]==zt[sa[j]]&&ud[x]<ud[sa[j]])) j--;         
		if (i<=j)         
		{             
			y=sa[i]; 
			sa[i]=sa[j]; 
			sa[j]=y;             
			i++; j--;         
		}     
	}     
	if (i<r) sort(i,r);     
	if (l<j) sort(l,j); 
} */
inline bool hungary() 
{     
	int Ans=0;     
	for(int i=1;i<=n;i++)     
	{         
		memset(Used,0,sizeof(Used));         
		Ans+=cross(i);     
	}     
	return Ans==n; 
} 
int main()
{
	ifstream fin("christmas.in");
	ofstream fout("christmas.out");
	fin>>n;
	for (i=1;i<=n;i++)
		fin>>boyh[i]>>boya[i];
	for (i=1;i<=n;i++)
		fin>>girlh[i]>>girla[i];
	m=2*n;
	int p=0;
	memset(map,0,sizeof(map));
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
		{
			map[i][j]=(boyh[i]-girlh[j])*(boyh[i]-girlh[j])+(boya[i]-girla[j])*(boya[i]-girla[j]);
			p++;
			a[p]=map[i][j];
		}
		sort(a+1,a+p+1);
	for (i=1;i<=m;i++)
		for (j=1;j<=m;j++)
			mapa[i][j]=map[i][j];
	l=1;r=p;
	mid=(l+r) / 2;
	X=a[mid];
	while (l<r)
	{
		memset(Mat,0,sizeof(Mat));
		if (hungary())
		{
			r=mid;
			mid=(l+r) / 2;
			X=a[mid];
		}
		else
		{
			l=mid+1;
			mid=(l+r) / 2;
			X=a[mid];
		}
	}
	fout<<a[l];
	fin.close();
	fout.close();
	return 0;
}

/*bool find(int k)
{
	int i;
	int al=1;
	int br=n;
	if (k<=br)
	{
		al=al+n;
		br=br+n;
	}
	for (i=al;i<=br;i++)
	{
		if ((map[k][i]>0)and(map[k][i]<=a[mid])) 
			if (d[i]==-1)
		{
			d[k]=i;
			d[i]=k;
			map[i][k]=map[k][i];
			map[k][i]=0;
			return true;
		}else{
			if (v[i]==true)
			{v[i]=false;
				if (find(i))
				{
					v[i]=false;
					d[k]=i;
					map[i][k]=map[k][i];
					map[k][i]=0;
				    return true;
				}
			}
		}
	}
	return false;
}
bool tg(int x)
{
	int sum=0;
	for (i=1;i<=n+n;i++)
		d[i]=-1;
	for (int i=1;i<=n;i++)
	{
		if (d[i]==-1)
		{
			if (find(i))
				sum++;
			memset(v,true,sizeof(v));
		}
	}
	for (int ii=1;ii<=n+n;ii++)
		for(int jj=1;jj<=n+n;jj++)
			map[ii][jj]=mapa[ii][jj];
		sum=0;
	for (int ii=1;ii<=n;ii++)
		if (d[ii]!=-1) sum++;
	if (sum==n)
	{
		return true;
	}else{
		return false;
	}
}*/