社区讨论
分治一堆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 条回复,欢迎继续交流。
正在加载回复...