#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,L;
bool flag=0;
vector<ll>A,B;
void dfs(const vector<ll>&x,const vector<ll>&y,ll d){
if (flag || x.empty()){flag=1;return;}//已经确定当前方案行
if (!d)return;//不需要再放置正方形了
ll minx=2e9,miny=2e9,maxx=-2e9,maxy=-2e9;
for (ll i=0;i<x.size();i++){
minx=min(minx,x[i]);maxx=max(maxx,x[i]);
miny=min(miny,y[i]);maxy=max(maxy,y[i]);
}
if (d==1){
flag=(max(maxx-minx,maxy-miny)<=L);
return;
}
vector<ll>x1,x2,x3,x4,y1,y2,y3,y4;
for (ll i=0;i<x.size();i++){
if (x[i]>minx+L || y[i]>miny+L)x1.push_back(x[i]),y1.push_back(y[i]);
if (x[i]<maxx-L || y[i]>miny+L)x2.push_back(x[i]),y2.push_back(y[i]);
if (x[i]>minx+L || y[i]<maxy-L)x3.push_back(x[i]),y3.push_back(y[i]);
if (x[i]<maxx-L || y[i]<maxy-L)x4.push_back(x[i]),y4.push_back(y[i]);
}
dfs(x1,y1,d-1);
dfs(x2,y2,d-1);
dfs(x3,y3,d-1);
dfs(x4,y4,d-1);
}
int main(){
scanf("%lld",&n);
for (ll i=1;i<=n;i++){
ll a,b;scanf("%lld%lld",&a,&b);
A.push_back(a);B.push_back(b);//放入容器
// cout << "flag" << endl;
}
// L=1;
// cout << "||";
ll l,r=20005;
// while (!flag){
//// cout << L << ":";
// flag=0;
// dfs(x,y,3),L++;
// }
while (r-l>1){
L=(r+l)/2;
// cout << l << "," << r << ":" << L << endl;
dfs(A,B,3);
if (!flag)l=L;
else r=L;
}
printf("%lld",L);
return 0;
}
之前把二分换成暴力枚举40(另TLE),改成二分后就0了。