数据太水了吧,我写个KDT都过了
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+8;
inline int read() {
int s=1,a=0;
char c=getchar();
while(!isdigit(c)) {
if(c=='-') s=-s;
c=getchar();
}
while(isdigit(c)) {
a=a*10+c-'0';
c=getchar();
}
return s*a;
}
int n;
int ansmin=1e9+7,ansmax;
struct point {
int x,y;
} a[N];
struct kdTree {
int ls,rs,rt;
point x;
int u,d,l,r;
} tr[N];
int root;
void pushup(int p) {
tr[p].l=tr[p].r=a[p].x;
tr[p].u=tr[p].d=a[p].y;
int lrt=tr[p].ls,rrt=tr[p].rs;
if(lrt) {
tr[p].l=min(tr[p].l,tr[lrt].l),tr[p].r=max(tr[p].r,tr[lrt].r);
tr[p].u=min(tr[p].u,tr[lrt].u),tr[p].d=max(tr[p].d,tr[lrt].d);
}
if(rrt) {
tr[p].l=min(tr[p].l,tr[rrt].l),tr[p].r=max(tr[p].r,tr[rrt].r);
tr[p].u=min(tr[p].u,tr[rrt].u),tr[p].d=max(tr[p].d,tr[rrt].d);
}
}
bool cmp1(point a,point b) {
return (a.x<b.x)||(a.x==b.x&&a.y<b.y);
}
bool cmp2(point a,point b) {
return (a.y<b.y)||(a.y==b.y&&a.x<b.x);
}
int build(int l,int r,int d) {
if(l>=r) return 0;
int mid=(l+r)>>1;
tr[mid].rt=mid;
if(d==1)
nth_element(a+l,a+mid,a+r,cmp1);
else
nth_element(a+l,a+mid,a+r,cmp2);
tr[mid].ls=build(l,mid,d^1);
tr[mid].rs=build(mid+1,r,d^1);
tr[mid].x=a[mid];
pushup(mid);
return mid;
}
int dist(point x,point y) {
return min(abs(x.x-y.x),abs(x.y-y.y));
}
int fmax(int a,point b) {
double ret=0;
ret=max(max(dist((point){tr[a].r,tr[a].u},b),dist((point){tr[a].l,tr[a].u},b)),max(dist((point){tr[a].r,tr[a].d},b),dist((point){tr[a].l,tr[a].d},b)));
return ret;
}
void querymax(int u,point x) {
if(!u) return;
ansmax=max(ansmax,dist(tr[u].x,x));
double disl=fmax(tr[u].ls,x),disr=fmax(tr[u].rs,x);
if(disl>ansmax&&disr>ansmax) {
if(disl>disr) {
querymax(tr[u].ls,x);
if(ansmax<disr) querymax(tr[u].rs,x);
}
else {
querymax(tr[u].rs,x);
if(ansmax<disl) querymax(tr[u].ls,x);
}
} else {
if(disl>disr) {
querymax(tr[u].ls,x);
if(ansmax<disr) querymax(tr[u].rs,x);
}
else {
querymax(tr[u].rs,x);
if(ansmax<disl) querymax(tr[u].ls,x);
}
}
}
int main() {
n=read();
for(int i=1;i<=n;i++) {
scanf("%d %d",&a[i].x,&a[i].y);
}
root=build(1,n,1);
for(int i=1;i<=n;i++) {
querymax(root,a[i]);
}
printf("%d\n",ansmax);
return 0;
}