138分求调
查看原帖
138分求调
930129
xqh2010楼主2025/7/21 15:03

思路见此第1条

#include<iostream>
#include<cmath>
#include<random>
#include<algorithm>
#include<time.h>
#define pi acos(-1.0)
using namespace std;
mt19937 rnd(time(0));
struct node{
    double x,y;
}a[400005];
int s=57,n,q;
double ans=8e15;//初始化答案
inline bool cmp(node a,node b){
    return a.x<b.x;//按照横坐标排序 
}
inline double dis(node a,node b){
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);//计算两点之间距离 
}
inline void calc(){
    for(register int i=1;i<=n;i++)
        for(register int j=i+1;j<=ceil(50000000.0/n)+i&&j<=n;j++)
            ans=min(ans,dis(a[i],a[j]));
}
inline void cala(){
    for(register int i=1;i<=n;i++)
        for(register int j=i+1;j<=ceil(36000000.0/n)+i&&j<=n;j++)
            ans=min(ans,dis(a[i],a[j]));
}
inline void around(double ds){
    ds=ds/180.0*pi;//角度转换为弧度 
    for(register int i=1;i<=n;i++){
        double x=a[i].x,y=a[i].y;
        a[i].x=x*cos(ds)-y*sin(ds);
        a[i].y=x*sin(ds)+y*cos(ds);
    }
    sort(a+1,a+1+n,cmp);//排序 
    if(n>=300000) calc();//计算 
    else cala();//计算 
}
inline long long read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9'){
		if(ch=='-'){
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0' && ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
signed main(){
    scanf("%d",&n);
    for(register int i=1;i<=n;i++){
    	a[i].x=read();
    	a[i].y=read();
        //scanf("%lf%lf",&a[i].x,&a[i].y);
    }
    around(0);//将原图像进行排序并枚举每个点与其后五个点比较
    if(n>=300000){
        for(q=1;q<=2;q++){
            around(rnd()%178+1);
        }
    }else{
        for(q=1;q<=3;q++){
            around(rnd()%178+1);
        }
    }
    printf("%lld\n",(long long)ceil(ans));
    return 0;
}
2025/7/21 15:03
加载中...