社区讨论

TLE了三个点,求调

P7883平面最近点对(加强加强版)参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@ly2yvwit
此快照首次捕获于
2024/07/01 20:39
2 年前
此快照最后确认于
2024/07/02 04:05
2 年前
查看原帖
rt,(感觉应该是个弱智错误,但实在是没看出来)
CPP
#include <bits/stdc++.h>
#define int long long 
using namespace std;
static const int N=1000000;
static const int INF=LONG_LONG_MAX;

int n,m;
struct Node{
	int cr[2];
	int Hg[2];
	int Lw[2];
	int Siz;
	int Ls,Rs;
}T[N];

int idx,cnt,root;
inline void PushUp(int rt){
	T[rt].Siz=T[T[rt].Ls].Siz+T[T[rt].Rs].Siz;
	for(int i:{0,1}){
		T[rt].Hg[i]=T[rt].Lw[i]=T[rt].cr[i];
		if(T[rt].Ls){
			T[rt].Lw[i]=min(T[rt].Lw[i],T[T[rt].Ls].Lw[i]);
			T[rt].Hg[i]=max(T[rt].Hg[i],T[T[rt].Ls].Hg[i]);
		}
		if(T[rt].Rs){
			T[rt].Lw[i]=min(T[rt].Lw[i],T[T[rt].Rs].Lw[i]);
			T[rt].Hg[i]=max(T[rt].Hg[i],T[T[rt].Rs].Hg[i]);
		}
	}
}
struct Point{
	int cr[2];
	Point(int x=0,int y=0){
		cr[0]=x;
		cr[1]=y;
	}
	inline int& operator[](int i){
		return cr[i];
	}
}P[N];

inline int SetUp(int l,int r,int k){
	if(l>r)
		return 0;
	int mid=l+r>>1;
	int rt=++idx;
	auto judge=[k](Point a,Point b)->bool{ return a.cr[k]<b.cr[k]; };
	nth_element(P+l,P+mid,P+r+1,judge);
	for(int i:{0,1})
		T[rt].cr[i]=P[mid][i];
	T[rt].Ls=SetUp(l,mid-1,k^1);
	T[rt].Rs=SetUp(1+mid,r,k^1);
	PushUp(rt);
	return rt;
}
inline int Dstnc(Point a,Point b){
	return (a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1]);
}

inline int measure(Node Np,Point P){
	auto sqr=[](int x)->int{return x*x;};
	int res=0;
	for(int i:{0,1}){
		if(P[i]<Np.Lw[i])
			res+=sqr(P[i]-Np.Lw[i]);
		if(P[i]>Np.Hg[i])
			res+=sqr(P[i]-Np.Hg[i]);
	}
	return res;
}

int res=INF;

inline void Query(int rt,Point P){
	if(!rt)
		return ;
	if(T[rt].cr[0]!=P[0] or T[rt].cr[1]!=P[1])
		res=min(res,Dstnc(Point(T[rt].cr[0],T[rt].cr[1]),P));
	int Lval=INF;
	int Rval=INF;
	if(T[rt].Ls)
		Lval=measure(T[T[rt].Ls],P);
	if(T[rt].Rs)
		Rval=measure(T[T[rt].Rs],P);
	if(Lval<Rval){
		if(Lval<res)
			Query(T[rt].Ls,P);
		if(Rval<res)
			Query(T[rt].Rs,P);
	}
	else{
		if(Rval<res)
			Query(T[rt].Rs,P);
		if(Lval<res)
			Query(T[rt].Ls,P);
	}
}

signed main(){
//	std::cin.tie(nullptr)->sync_with_stdio(false);
//	std::cout.tie(nullptr)->sync_with_stdio(false);
	cin>>n;
	T[0].Lw[0]=INF;
	T[0].Lw[1]=INF;
	T[0].Hg[0]=-INF,
	T[0].Hg[1]=-INF;
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		P[i]={x,y};
	}
	auto judge=[](Point a,Point b){
		return a[0]==b[0]?a[1]<b[1]:a[0]<b[0];
	};
	sort(P+1,P+1+n,judge);
	root=SetUp(1,n,0);
	for(int i=1;i<=n;i++){
		Query(root,P[i]);
	}
//	printf("%.4lf",sqrt(res));
	cout<<res;
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...