abc F - Dist Max 2
(二分求答案)
链接
给n个点, 求min(|xi−xj|,|yi−yj|)的最大值
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
typedef pair<int , int >PII ;
int n ;
struct node
{
int x , y ;
}all[N] ;
bool cmp(node a ,node b )
{
return a.x<b.x;
}
bool check(int k )
{
int maxx = -1e9 , minn = 1e9 ;
for(int i = 0 , j = 0 ; i < n ; i ++ )
{
while(j <i && all[i].x - k >= all[j].x)
{
maxx = max(maxx , all[j].y) ;
minn = min(minn , all[j].y) ;
j ++ ;
}
//只有all[i].x - k >= all[j].x 的时候才会更新maxx 和minn
if(maxx - all[i].y>= k || all[i].y - minn >= k ) return true;
}
return false ;
}
int main()
{
cin>>n;
for(int i = 0 ; i < n ; i ++ ) cin>>all[i].x>>all[i].y;
sort(all ,all + n ,cmp ) ;
int l = 0 , r = 1e9 ;
while(l < r )
{
int mid = l + r + 1 >> 1 ;
//cout<<mid<<endl;
if(check(mid)) l = mid ;
else r = mid - 1 ;
}
cout<<l ;
return 0 ;
}