只有 30 分,翻了题解觉得思路是差不多的
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define int long long
#define ull unsigned long long
#define re register
#define for_(a,b,c) for(int a=b;a<=c;a++)
#define _for(a,b,c) for(int a=b;a>=c;a--)
#define firein(a) freopen(a".in","r",stdin)
#define fireout(a) freopen(a".out","w",stdout)
#define fire(a) (firein(a),fireout(a))
#define lc(q) (q<<1)
#define rc(q) (q<<1|1)
#define mid(l,r) ((l+r)>>1)
using namespace std;
const int N=0x66ccff;
const int M=0x6cf;
const ll INF=0x66ccff0712ll;
const ll inf=LLONG_MAX;
const int N = 100050;
class Point{
public:
int x,y;
}P[N];
int n, vis[N];
int X[2],Y[2];
inline bool DFS(int L,int siz){
X[0]=inf;Y[0]=inf;
X[1]=-inf;Y[1]=-inf;
for_(i,1,n){
if(!vis[i]){
X[0]=min(X[0],P[i].x);
X[1]=max(X[1],P[i].x);
Y[0]=min(Y[0],P[i].y);
Y[1]=max(Y[1],P[i].y);
}
}
if(siz==1){
return ((X[1]<=L+X[0])&&(Y[1]<=L+Y[0]));
}
for_(i,0,1) {
for_(j,0,1){
for_(k,1,n){
if(!vis[k]){
if(max(abs(P[k].x-X[i]),abs(P[k].y-Y[j]))<=L){
vis[k]=siz;
}
}
}
if(DFS(L,siz-1)){
return true;
}
for_(k,1,n){
if(vis[k]==siz){
vis[k]=0;
}
}
}
}
return false;
}
inline void In(){
cin >> n;
int MinX=inf,MinY=inf,MaxX=-inf,MaxY=-inf;
for_(i,1,n){
cin >> P[i].x >> P[i].y;
MinX=min(MinX,P[i].x);
MaxX=max(MaxX,P[i].x);
MinY=min(MinY,P[i].y);
MaxY=max(MaxY,P[i].y);
}
int l=0, r=max(MaxX-MinX,MaxY-MinY), mid;
while(l<=r) {
mid=(l+r)/2;
memset(vis,0,sizeof(vis));
if(!DFS(mid,3)) {
l=mid+1;
}
else{
r=mid-1;
}
}
cout << l << endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
In();
}