P7883 re 求助
  • 板块学术版
  • 楼主HINODE
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/10/12 13:29
  • 上次更新2023/11/4 04:00:26
查看原帖
P7883 re 求助
382512
HINODE楼主2021/10/12 13:29
#include<bits/stdc++.h>
#define z 1003
#define r register
using namespace std;
struct qssr{
	int x,y;
}q[400100],e[400100];
inline qssr in(int x,int y){
	qssr t;t.x=x,t.y=y;return t;
}
inline void read(int &x){ 
	int f=1;x=0;char s=getchar();
	while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
	while(s>='0'&&s<='9'){x=x<<3+x<<1+s-'0';s=getchar();}
	x*=f;
}
std::vector<qssr> f[z][z];
inline double l(const qssr a,const qssr b){return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));}
int n,nx,ny,hl,dx,dy;
qssr tmp;
double di,d;
signed main(){
	//srand(time(0));
	scanf("%d",&n);
	for(r int i=1;i<=n;++i){
		scanf("%d%d",&q[i].x,&q[i].y);
		q[i].x+=10000000;
		q[i].y+=10000000;
	}
	//random_shuffle(q+1,q+n+1);
	di=l(q[1],q[2]);
	f[int(q[1].x/di)%z][int(q[1].y/di)%z].push_back(in(q[1].x,q[1].y));
	f[int(q[2].x/di)%z][int(q[2].y/di)%z].push_back(in(q[2].x,q[2].y));
	e[1]=in(int(q[1].x/di)%z,int(q[1].y/di)%z);
	e[2]=in(int(q[2].x/di)%z,int(q[2].y/di)%z);
	//cout<<di<<' ';
	for(r int i=3;i<=n;++i){
		d=di;
		nx=int(q[i].x/di)%z,ny=int(q[i].y/di)%z;
		tmp=in(q[i].x,q[i].y);
		for(r int _x=-1;_x<2;++_x){
			for(r int _y=-1;_y<2;++_y){
				dx=(nx+_x)%z;dy=(ny+_y)%z;
				hl=f[dx][dy].size();
				for(r int it=0;it<hl;++it){
					d=min(d,l(tmp,f[dx][dy][it]));
				}
			}
		}
		if(d<di){
			di=d;
			/*while(cnt){
				f[e[cnt].x][e[cnt].y].clear();
				--cnt;
			}*/
			for(r int j=1;j<i;++j){
				f[e[j].x][e[j].y].erase(f[e[j].x][e[j].y].begin());
				nx=int(q[j].x/di)%z,ny=int(q[j].y/di)%z;
				f[nx][ny].push_back(in(q[j].x,q[j].y));
				e[j]=in(nx,ny);
			}
		}
		nx=int(q[i].x/di)%z,ny=int(q[i].y/di)%z;
		f[nx][ny].push_back(in(q[i].x,q[i].y));
		e[i]=in(nx,ny);
		//cout<<di<<' ';
		//if((double)clock()/CLOCKS_PER_SEC>0.330) break;
	}
	printf("%.0lf",di*di);
	return 0;
}
2021/10/12 13:29
加载中...