求助92分
查看原帖
求助92分
328935
calmsGZ省队2024楼主2023/3/16 20:53
#include<bits/stdc++.h>

using namespace std;

int n;

struct node{
	int x,y;
}p[50005];
int l;
node top[50005];

bool cmp(node a,node b){
	if(a.x==b.x){
		return a.y<b.y;
	}else{
		return a.x<b.x;
	}
}

int dot(node a,node b){
	return a.x*b.x+a.y*b.y;
}

int cross(node a,node b){
	return a.x*b.y-a.y*b.x;
}

int Len(node a){
	return dot(a,a);
}

node operator -(node a,node b){
	return node{a.x-b.x,a.y-b.y};
}

int main(){
//	freopen("1.in","r",stdin);
//	freopen("2.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&p[i].x,&p[i].y);
	}
	if(n==1){
		cout<<0;
		return 0;
	}
	sort(p+1,p+1+n,cmp);
	top[++l]=p[1];
	for(int i=2;i<=n;i++){
		while(l>1&&cross(top[l]-top[l-1],p[i]-top[l-1])<=0){
			l--;
		}
		top[++l]=p[i];
	}
	int k=l;
	for(int i=n-1;i>=1;i--){
		while(l>k&&cross(top[l]-top[l-1],p[i]-top[l-1])<=0){
			l--;
		}
		top[++l]=p[i];
	}
	if(l==2){
		printf("%d\n",Len(top[2]-top[1]));
		return 0;
	}
	int j=3;
	int ans=0;
	for(int i=1;i<=l;i++){
		while(abs(cross(top[j]-top[i],top[i+1]-top[i]))<abs(cross(top[j%l+1]-top[i],top[i+1]-top[i]))){
			j=j%l+1;
		//	cout<<j<<endl;
		}
		ans=max(ans,max(Len(top[j]-top[i]),Len(top[j]-top[i+1])));
	}
	printf("%d\n",ans);
	return 0;
} 
2023/3/16 20:53
加载中...