最后两个点WA了,求助
查看原帖
最后两个点WA了,求助
199459
Masna_Kimoyo楼主2022/1/20 16:43

84pts,O(n2)O(n^2) 算法(可过)

求助

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e4+5;
struct node{
	int x,y;
	inline bool operator <(const node &a)  const{
		return a.x==x?a.y<y:a.x<x;
	}
}p[N];
inline int read(){
	int x=0;
	bool w=0;
	char c=getchar();
	while(!isdigit(c))	w|=c=='-',c=getchar();
	while(isdigit(c))	x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return w?-x:x;
}
#define printlf(x) print(x),putchar('\n')
#define printsp(x) print(x),putchar(' ')
inline void print(int x){
	if(x<0)	x=-x,putchar('-');
	if(x>9)	print(x/10);
	putchar('0'+x%10);
}
inline node getvec(node a,node b){
	return (node){a.x-b.x,a.y-b.y};
}
inline int xmul(node a,node b){
	return a.x*b.y-a.y*b.x;
}
inline int dis(node a,node b){
	return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int s[N];
int n,cnt,ans;
signed main(){
	n=read();
	for(register int i=1;i<=n;++i)	p[i].x=read(),p[i].y=read();
	sort(p+1,p+1+n);
	s[++cnt]=1;
	for(register int i=2;i<=n;++i){
		node a=getvec(p[s[cnt-1]],p[s[cnt]]),b=getvec(p[s[cnt]],p[i]);
		while(xmul(a,b)<0 && cnt>1)	--cnt,a=getvec(p[s[cnt-1]],p[s[cnt]]),b=getvec(p[s[cnt]],p[i]);
		s[++cnt]=i;	
	}
	s[++cnt]=n;
	for(register int i=n-1;i;--i){
		node a=getvec(p[s[cnt-1]],p[s[cnt]]),b=getvec(p[s[cnt]],p[i]);
		while(xmul(a,b)<0 && cnt>1)	--cnt,a=getvec(p[s[cnt-1]],p[s[cnt]]),b=getvec(p[s[cnt]],p[i]);
		s[++cnt]=i;
	}
	for(register int i=1;i<cnt;++i)
		for(register int j=i+1;j<=cnt;++j)
			ans=max(ans,dis(p[s[i]],p[s[j]]));
	print(ans);
	return 0;
}

2022/1/20 16:43
加载中...