飞花的传送门 分类: 比赛 2015-06-18 16:55 21人阅读 评论(0) 收藏

飞花的传送门

TimeLimit: 1000ms Memory limit: 65536K

题目描述

飞花壕最近手头比较宽裕,所以想买两个传送门来代步(夏天太热,实在是懒得走路)。平面上有N个传送门,飞花壕想要挑两个距离最远的传送门带回家(距离为欧几里得距离,即两点之间直线距离)。

请你帮他算一算他所挑选的最远的两个传送门有多远。

输入

多组输入。

对于每组输入,第一行输入一个整数N2<= N <= 50000),接下来从第2行到第N+1行,每行两个整数(XiYi),代表第i个传送门的坐标(-1000000<= Xi , Yi <= 1000000)。

数据为随机生成。

输出

输出一个整数,代表飞花壕要挑选的两个传送门的距离的平方。

示例输入

4

00

01

11

10

示例输出

2

/*
校赛的一道题,开始不知道什么意思,比完后听他们说是凸包;
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>

using namespace std;

typedef long long LL;

const int Max=51000;

struct node
{
    LL x;
    LL y;
}point[Max],AA[Max];
LL py,px;
bool cmp(node a,node b)
{
    return atan2(a.y-py, a.x-px) < atan2(b.y-py, b.x-px);
}

double compare(double x1,double y1,double x2,double y2)
{
    return x1*y2-x2*y1;
}

double compare(int a,int b,int c)
{
    return compare(AA[b].x-AA[a].x,AA[b].y-AA[a].y,point[c].x-AA[a].x,point[c].y-AA[a].y);
}

LL dis(int a,int b)
{
    return (AA[a].x-AA[b].x)*(AA[a].x-AA[b].x)+(AA[a].y-AA[b].y)*(AA[a].y-AA[b].y);
}

int main()
{
    int n;
    int top;
    LL sum;
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
        {
            scanf("%lld %lld",&point[i].x,&point[i].y);
            if(i)
            {
                if(py>point[i].y)
                {
                    py=point[i].y;
                    px=point[i].x;
                }
                else if(py==point[i].y&&px>point[i].x)
                {
                    px=point[i].x;
                }
            }
            else
            {
                py=point[i].y;
                px=point[i].x;
            }
        }

        sort(point ,point+n, cmp);

        AA[0]=point[0];
        AA[1]=point[1];
        top=1;
        for(int i=2;i<n;)
        {
            if(top&&compare(top-1,top,i)<=0)
            {
                top--;
            }
            else
            {
                AA[++top]=point[i++];
            }
        }
        while(compare(top-1,top,0)<=0)
        {
            top--;
        }
        sum=0;
        LL ans;
        for(int i=0;i<=top;i++)
        {
            for(int j=i+1;j<=top;j++)
            {
                ans=dis(i,j);
                if(sum<ans)
                {
                    sum=ans;
                }
            }
        }
        printf("%lld\n",sum);
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-06-18 16:55  一骑绝尘去  阅读(142)  评论(0编辑  收藏  举报