WA on #12, 93pts.
查看原帖
WA on #12, 93pts.
724676
Iwara_qwq楼主2022/6/13 15:41

rt
心态炸了

const ll MAXN=5e4+5;
ll n,ans;
struct point{
	ldb X,Y;
};
point p[MAXN];
ldb dis(point p1,point p2){
	return (p1.X-p2.X)*(p1.X-p2.X)+(p1.Y-p2.Y)*(p1.Y-p2.Y);
}
bool cmp_y(point p1,point p2){
	return p1.Y==p2.Y?p1.X<p2.X:p1.Y<p2.Y;
}
bool cmp_angle(point p1,point p2){
	ldb k1=(p1.Y-p[1].Y)/(p1.X-p[1].X),k2=(p2.Y-p[1].Y)/(p2.X-p[1].X);
	if(k1==k2)return abs(p1.X)<abs(p2.X);
	if(k1<0){
		if(k2>0)return 0;
		else return k1<k2;
	}
	else{
		if(k2<0)return 1;
		else return k1<k2;
	}
}
ldb cross(point O,point A,point B){
	ll x1=A.X-O.X,y1=A.Y-O.Y,x2=B.X-O.X,y2=B.Y-O.Y;
	return x1*y2-x2*y1;
}
ldb height(point p1,point p2,point tp){
	ldb s=abs(cross(p1,p2,tp))/2.0;
	return s/sqrt(dis(p1,p2));
}
point q[MAXN];
ll cnt;
int main(){
	n=read();
	for(int i=1;i<=n;i++)p[i].X=read(),p[i].Y=read();
	if(n==2){
		cout<<(ll)dis(p[1],p[2]);
		return 0;
	}
	sort(p+1,p+1+n,cmp_y);
	sort(p+2,p+1+n,cmp_angle);
//	cout<<endl;
//	for(int i=1;i<=n;i++)cout<<p[i].X<<" "<<p[i].Y<<endl;
//	cout<<endl;
	cnt=2;
	q[1]=p[1],q[2]=p[2];
	for(int i=3;i<=n;i++){
		while(cnt>1&&cross(q[cnt-1],q[cnt],p[i])<=0)cnt--;
		q[++cnt]=p[i];
	}
	if(cnt==2){
//		cout<<"qwq"<<endl;
		cout<<dis(q[1],q[2]);
		return 0;
	}
	q[++cnt]=q[1];
//	cout<<cnt<<endl;
//	for(int i=1;i<=n;i++)cout<<q[i].X<<" "<<q[i].Y<<endl;
//	cout<<endl;
	ll p1=1;
	while(p1<=cnt){
		ll p2=p1+1,tp=p1+2;
		if(p2>cnt)p2-=cnt;
		if(tp>cnt)tp-=cnt;
		while(height(q[p1],q[p2],q[tp])<=height(q[p1],q[p2],q[tp==cnt?1:tp+1])){
			tp++;
			if(tp>cnt)tp=1;
		}
		ans=MAX((ldb)ans,dis(q[p1],q[tp]),dis(q[p2],q[tp]));
		p1++;
	}
	cout<<ans;
	return 0;
}
2022/6/13 15:41
加载中...