KDT求助
查看原帖
KDT求助
335422
钓鱼王子楼主2021/4/5 22:02

蒟蒻的 KDT 每次都比同机房的巨佬慢一倍,省选之前交模板题又 TLE,求大佬帮忙看看/kel

#include<bits/stdc++.h>
#define re register
using namespace std;
inline int read(){
	re int t=0;re char v=getchar();
	while(v<'0')v=getchar();
	while(v>='0')t=(t<<3)+(t<<1)+v-48,v=getchar();
	return t;
}
struct node{int x,y;}p[100002],mx[100002],mn[100002];
int n,k,ls[100002],rs[100002];
priority_queue<long long>q;
inline bool cmp1(re node x,re node y){return x.x<y.x;}
inline bool cmp2(re node x,re node y){return x.y<y.y;}
inline void gmx(re int &x,re int y){y>x&&(x=y);}
inline void gmn(re int &x,re int y){y<x&&(x=y);}
inline long long dis(re int y,re node x){
	re int X=max(x.x-mn[y].x,mx[y].x-x.x),Y=max(x.y-mn[y].y,mx[y].y-x.y);
	return 1ll*X*X+1ll*Y*Y;
}
inline int build(re int l,re int r,re int d){
	if(l==r){
		mx[l]=mn[l]=p[l];
		return l;
	}
	re int mid=l+r>>1;
	if(d)sort(p+l,p+r+1,cmp1);
	else sort(p+l,p+r+1,cmp2);
	mx[mid]=mn[mid]=p[mid];
	if(l^mid)ls[mid]=build(l,mid-1,d^1);
	rs[mid]=build(mid+1,r,d^1);
	gmx(mx[mid].x,max(mx[ls[mid]].x,mx[rs[mid]].x)),gmx(mx[mid].y,max(mx[ls[mid]].y,mx[rs[mid]].y));
	gmn(mn[mid].x,min(mn[ls[mid]].x,mn[rs[mid]].x)),gmn(mn[mid].y,min(mn[ls[mid]].y,mn[rs[mid]].y));
	return mid;
}
inline void ck(re int x,re node y){
	if(!x)return;
	re int mx=abs(y.x-p[x].x),my=abs(y.y-p[x].y);
	re long long d=1ll*mx*mx+1ll*my*my,d1=dis(ls[x],y),d2=dis(rs[x],y);
	if(d>-q.top())q.pop(),q.push(-d);
	if(d1>d2){
		if(d1>-q.top())ck(ls[x],y);
		if(d2>-q.top())ck(rs[x],y);
	}
	else{
		if(d2>-q.top())ck(rs[x],y);
		if(d1>-q.top())ck(ls[x],y);
	}
}
signed main(){
	n=read(),k=read()*2;
	for(re int i=1;i<=n;++i)p[i].x=read(),p[i].y=read();
	re int rt=build(1,n,0);
	for(re int i=1;i<=k;++i)q.push(0);
	for(re int i=1;i<=n;++i)ck(rt,p[i]);
	printf("%lld",-q.top());
}

2021/4/5 22:02
加载中...