比赛 20120418x 评测结果 AAAAAA
题目名称 圣诞节 最终得分 100
用户昵称 kaaala 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-18 15:55:06
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<deque>
 
using namespace std;
 
const int oo=~0u>>2;
 
struct edge 
{
    int t,cost;
    edge *next;
    edge(int _t,int _cost,edge *_next):t(_t),cost(_cost),next(_next){}
}*Map[250010];
 
struct Node
{
    int h,age;
}A[2][250010];
 
int N,ans,tot,sum[250010],S,T,re,pre[250010],m;
bool vis[250010];
 
void addedge(int s,int t,int cost)
{
    Map[s]=new edge(t,cost,Map[s]);
    Map[t]=new edge(s,cost,Map[t]);
}
 
int pw(int i,int j)
{
    return (i-j)*(i-j);
}
 
bool augment(int u)
{
	for(edge *p=Map[u];p;p=p->next)
	{
		int t=p->t,cost=p->cost;
		if(!vis[t]&&cost<=ans)
		{
			vis[t]=true;
			if(!pre[t]||augment(pre[t]))
			{
				pre[t]=u;
				pre[u]=t;
				return true;
			}
		}
	}
	return false;
}
 
int main()
{
    freopen("christmas.in","r",stdin);
    freopen("christmas.out","w",stdout);
    scanf("%d",&N);
    S=0;
    T=N*2+1;
    for(int i=1;i<=N;i++)
        scanf("%d%d",&A[0][i].h,&A[0][i].age);
    for(int i=1;i<=N;i++)
        scanf("%d%d",&A[1][i].h,&A[1][i].age);
    for(int i=1;i<=N;i++)
        for(int j=1;j<=N;j++)
        {
			m++;
            sum[m]=pw(A[0][i].h,A[1][j].h)+pw(A[0][i].age,A[1][j].age);
            addedge(i,j+N,sum[m]);
        }
    sort(sum+1,sum+1+m);
	int i=1;
	while(true)
	{
		i++;
		while(sum[i]==sum[i-1])
			i++;
		ans=sum[i];
		for(int j=1;j<=N;j++)
			if(!pre[j])
			{
				memset(vis,0,sizeof(vis));
				tot+=augment(j);
				if(tot==N)
				{
					printf("%d\n",ans);
					return 0;
				}
			}
	}
    return 0;
}