hrbust 1421最远点对旋转卡壳
LOLI们想知道最大的距离的平方和是多少
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct Point
{
long long x,y,len;
}Pt[30005],Stack[30005],Point_A;
long long Cross(Point a,Point b,Point c)
{
return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
long long Dis(Point a,Point b)
{
return pow(a.x-b.x,2)+pow(a.y-b.y,2);
// return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
void FindPoint(int n)
{
int i,tempNumber=0;
Point tempPoint;
Point_A=Pt[0];
for(i=1;i<n;i++)
{
if(Pt[i].y<Point_A.y||Pt[i].y==Point_A.y&&Pt[i].x<Point_A.x)
{
tempNumber=i;
Point_A=Pt[i];
}
}
tempPoint=Pt[0];
Pt[0]=Pt[tempNumber];
Pt[tempNumber]=tempPoint;
}
bool Cmp(Point a,Point b)
{
long long k=Cross(Point_A,a,b);
if(k>0) return true;
if(k<0) return false;
a.len=Dis(Point_A,a);
b.len=Dis(Point_A,b);
return a.len>b.len;
}
int Graham(int n)
{
int i,top=2;
Pt[n]=Pt[0];
Stack[0]=Pt[0];
Stack[1]=Pt[1];
Stack[2]=Pt[2];
for(i=3;i<=n;i++)
{
while(Cross(Stack[top-1],Stack[top],Pt[i])<=0&&top>1)
top--;
Stack[++top]=Pt[i];
}
return top;
}
long long rotating_calipers(Point *ch,int n)
{
int q=1;
long long ans=0;
ch[n]=ch[0];
for(int p=0;p<n;p++)
{
while(Cross(ch[p+1],ch[q+1],ch[p])>Cross(ch[p+1],ch[q],ch[p]))
q=(q+1)%n;
ans=max(ans,max(Dis(ch[p],ch[q]),Dis(ch[p+1],ch[q+1])));
}
return ans;
}
int main(void)
{
int i,Num;
while(scanf("%d",&Num)!=EOF)
{
for(i=0;i<Num;i++)
scanf("%lld%lld",&Pt[i].x,&Pt[i].y);
FindPoint(Num);
sort(Pt+1,Pt+Num,Cmp);
int s= Graham(Num);
long long res=rotating_calipers(Stack,s);
printf("%lld\n",res);
}
return 0;
}
hrbust 1421 最远点对(旋转卡壳)
最新推荐文章于 2019-09-26 12:44:12 发布
