P7883 WA 144分求助
  • 板块灌水区
  • 楼主D0000
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/11 10:38
  • 上次更新2023/11/11 12:20:18
查看原帖
P7883 WA 144分求助
982681
D0000楼主2023/11/11 10:38
#include<cstdio>
#include<cstdio>
#include<algorithm>
#include<cmath>
struct node{
	long long x,y;
}a[400005],b[400005],ss[400005];
long long ans=(long long)(2e14);
int n;
bool cmp(node x,node y){
	return x.x<y.x;
}
long long min(long long x,long long y){
	return x>y?y:x;
}
long long abs(long long x){
	return x>-x?x:-x;
}
void gb(int l,int r){
	if(l==r)return;
	int mid=(l+r)>>1;
	gb(l,mid);gb(mid+1,r);
	int i=l,j=mid+1,cnt=0,k=l;
	while(i<=mid||j<=r){
		int now;
		if(i>mid)now=j++;
		else if(j>r)now=i++;
		else if(a[i].y<a[j].y)now=i++;
		else now=j++;
		ss[k].x=a[now].x;
		ss[k++].y=a[now].y;
		if((fabs(a[mid].x-a[now].x)<sqrt(ans)*28))b[++cnt].x=a[now].x,b[cnt].y=a[now].y;
	}
	for(int i=l;i<=r;i++)a[i].x=ss[i].x,a[i].y=ss[i].y;
	
	for(int i=1;i<cnt;i++){
		for(int j=i+1;j<=cnt&&b[j].y-b[i].y<sqrt(ans);j++){
			ans=min(ans,(b[j].x-b[i].x)*(b[j].x-b[i].x)+(b[j].y-b[i].y)*(b[j].y-b[i].y));
		}
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%lld%lld",&a[i].x,&a[i].y);
	std::sort(a+1,a+n+1,cmp);
	gb(1,n);printf("%lld",(ans));
	
} 
2023/11/11 10:38
加载中...