排序,$O(n)$扫描。
$city$与$tower$混在一起排序,然后从左到右扫描一遍,计算出每一个$city$左边的$tower$对他的影响。
再从右到左扫描一遍,计算出每一个$city$右边的$tower$对他的影响。然后再扫描一遍计算出$max$就可以了。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0),eps=1e-8; void File() { freopen("D:\in.txt","r",stdin); freopen("D:\out.txt","w",stdout); } template <class T> inline void read(T &x) { char c = getchar(); x = 0;while(!isdigit(c)) c = getchar(); while(isdigit(c)) { x = x * 10 + c - '0'; c = getchar(); } } const int maxn=100010; struct X { int p,t; }s[2*maxn]; int f[2*maxn],sum,n,m; bool cmp1(X a,X b) { if(a.p==b.p) return a.t>b.t; return a.p<b.p; } bool cmp2(X a,X b) { if(a.p==b.p) return a.t<b.t; return a.p<b.p; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&s[i].p); s[i].t=1; } for(int i=1;i<=m;i++) { scanf("%d",&s[i+n].p); s[i+n].t=2; } for(int i=1;i<=n+m;i++) f[i]=0x7FFFFFFF; sort(s+1,s+1+n+m,cmp1); int pre=0x7FFFFFFF; for(int i=1;i<=n+m;i++) { if(s[i].t==2) pre=s[i].p; if(s[i].t==1&&pre!=0x7FFFFFFF) f[i]=min(f[i],s[i].p-pre); } pre=0x7FFFFFFF; for(int i=n+m;i>=1;i--) { if(s[i].t==2) pre=s[i].p; if(s[i].t==1&&pre!=0x7FFFFFFF) f[i]=min(f[i],pre-s[i].p); } int ans=0; for(int i=1;i<=n+m;i++) { if(s[i].t==2) continue; ans=max(ans,f[i]); } printf("%d ",ans); return 0; }