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