114 分,为什么错啊
查看原帖
114 分,为什么错啊
525374
sgl654321风起 Oier楼主2023/5/1 11:24
#include<bits/stdc++.h>
#define maxn 400010
using namespace std;
long long read(){
	long long x=0,sgn=1;char ch=getchar();
	while(ch<'0' || ch>'9'){if(ch=='-')sgn=-1;ch=getchar();}
	while(ch>='0' && ch<='9'){x=(x<<3)+(x<<1)+(ch&15);ch=getchar();}
	return x*sgn;
}
struct node{
	long long x,y;
}a[maxn],b[maxn],save[maxn];
long long n;
double ans;
double dis(node n1,node n2){
	return sqrt((n1.x-n2.x)*(n1.x-n2.x)+(n1.y-n2.y)*(n1.y-n2.y));
}
bool cmp(node n1,node n2){
	return n1.x<n2.x;
}
void mer(long long l,long long r){
	if(r-l+1<2)return;
	long long mid=(l+r)>>1;
	mer(l,mid);
	mer(mid+1,r);
	long long zuo=l,you=mid+1,tot=0;
	while(zuo<=mid||you<=r){
		if(zuo<=mid&&(you==r+1||a[zuo].y<a[you].y))
			save[++tot]=a[zuo],zuo++;
		else save[++tot]=a[you],you++;
	}
	for(int i=1;i<=tot;i++)a[i+l-1]=save[i];
	tot=0;
	for(int i=l;i<=r;i++)
		if(abs(a[i].x-a[mid].x)<=ans)b[++tot]=a[i];
	long long j=1;
	for(int i=1;i<=tot;i++){
		while(j<tot&&b[j].y-b[i].y<=ans)j++;
		for(int k=i+1;k<=j;k++)
			ans=min(ans,dis(b[k],b[i]));
	}
}
int main(){
	n=read();
	ans=LONG_LONG_MAX;
	for(int i=1;i<=n;i++)
		a[i].x=read(),a[i].y=read();
	sort(a+1,a+1+n,cmp);
	mer(1,n);
	printf("%.0lf\n",ans*ans);
	return 0;
}

尝试了好久了都过不去。就是分治的思路。有 dl 来看看吗?

2023/5/1 11:24
加载中...