蒟蒻的 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());
}