社区讨论

分治一堆TLE 18pts

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lo177urk
此快照首次捕获于
2023/10/22 16:20
2 年前
此快照最后确认于
2023/11/02 15:58
2 年前
查看原帖
RT,是我写假了吗? 求巨佬帮调
CPP
#include<bits/stdc++.h>
#define int long long
template<class T=int>
inline T read() {
    T x=0,sgn=0; char ch=0;
    for(;!isdigit(ch);ch=getchar()) sgn|=ch=='-';
    for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
    return sgn?-x:x;
}
inline void write(char ch) {putchar(ch);}
template<class T>
inline void write(T x) {
    static char ch[40]; int p=0;
    if(x<0) putchar('-'),x=-x;
    do ch[++p]=(x%10)^48,x/=10; while(x);
    while(p) putchar(ch[p--]);
}
template<class T,class... U>
inline void write(T x,U ...t) {
    write(x),write(t...);
}
using namespace std;
const int N=4e5+10;
int n;
struct node {int x,y;} a[N];
inline int dis(node &x,node &y) {
	return pow(x.x-y.x,2)+pow(x.y-y.y,2);
}
inline int FZ(int l,int r) {
	// cerr<<l<<' '<<r<<endl;
	if(l>=r) return LONG_LONG_MAX;
	if(l+1==r) return dis(a[l],a[r]);
	int mid=l+r>>1;
	int d=min(FZ(l,mid),FZ(mid+1,r));
	vector<node> vc;
	for(int i=l;i<=r;++i)
		if(abs(a[mid].x-a[i].x)<d)
			vc.push_back(a[i]);
	sort(vc.begin(),vc.end(),[&](node x,node y) {
		return x.x==y.x?x.y<y.y:x.x<y.x;
	});
	for(auto l=vc.begin(),r=l;l!=vc.end();++l) {
		while(r!=vc.end()&&abs((*l).x-(*r).x)<d) ++r;
		for(auto i=l+1;i!=r;++i)
			d=min(d,dis(*l,*i));
	}
	return d;
}
signed main() {
	n=read();
	for(int i=1;i<=n;++i) a[i]={read(),read()};
	sort(a+1,a+n+1,[&](node x,node y) {
		return x.x==y.x?x.y<y.y:x.x<y.x;
	});
	write(FZ(1,n));
	return 0;
}

回复

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

正在加载回复...