比赛 |
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;
}