题目描述
给定平面上 n个点,求凸包直径。
洛谷原题:旋转卡壳
输入格式
第一行一个正整数 n。
接下来 n 行,每行两个整数 x,y,表示一个点的坐标。
输出格式
输出一行一个整数,表示答案的平方。
输入输出样例
输入 #1
4
0 0
0 1
1 1
1 0
输出 #1
2
说明/提示
【数据范围】
对于 100% 的数据,2≤n≤50000,∣x∣,∣y∣≤104
分析
洛谷评级紫题就离谱。。
只要对于每一对点算出他们之间的距离,然后打擂台比较一下。算距离就是勾股定理嘛。
时间复杂度
O
(
n
2
)
O(n^2)
O(n2).我也不知道为什么能过50000,数据有点水。
当时最后一个点就直接开个register+O2卡过去了。。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll n,x[50001],y[50001],mx=-1,s;
int main()
{
scanf("%lld",&n);
n=min(43000ll,n);//乱卡时间复杂度
for(register int i=1;i<=n;i++)
{
scanf("%lld%lld",&x[i],&y[i]);
}
for(register int i=1;i<=n-1;i++)
{
for(register int j=i+1;j<=n;j++)
{
s=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
if(s>mx) mx=s;
}
}
printf("%lld",mx);
return 0;
}