E - Dist Max 2https://vjudge.csgrandeur.cn/problem/AtCoder-abc215_f
AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=2e5+10,inf=0x3f3f3f3f;
struct node
{
int x,y;
}a[N];
int n;
bool cmp(node a,node b)
{
if (a.x!=b.x)return a.x<b.x;
else return a.y<b.y;
}
bool check(int mid)
{
int l=1;
int mi=inf,ma=-1;
for (int i=1;i<=n;i++)//遍历所有点
{
while (l<=n&&a[i].x-a[l].x>=mid)//遍历所有点,找到满足while条件的点,并找到最大值最小值
{
mi=min(mi,a[l].y),ma=max(ma,a[l].y);//找最大最小的y值,目的是这样与a[i].y的差值才能尽可能大,才最有可能找到>=mid的点
l++;
}//一个点的x,y都大于mid,min(x,y)才肯定>=mid
if (a[i].y-mi>=mid||ma-a[i].y>=mid)//只要找到存在距离>=mid的点,返回true,并缩小范围
return true;
}
return false;
}
signed main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
cin>>a[i].x>>a[i].y;
sort(a+1,a+n+1,cmp);//排序的目的,我认为是二分肯定需要排序,并且更方便找最大和最小的y值
int l=0,r=1e9;
while (l<r)
{
int mid=(l+r+1)>>1;//假设答案为mid,二分验证缩小范围
if (check(mid))l=mid;
else r=mid-1;
}
printf("%d\n",l);
return 0;
}
超时:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=2e5+10,inf=0x3f3f3f3f;
struct node
{
int x,y;
}a[N];
int n;
bool cmp(node a,node b)
{
if (a.x!=b.x)return a.x<b.x;
else return a.y<b.y;
}
bool check(int mid)
{
int l=1;
int mi=inf,ma=-1;
for (int i=1;i<=n;i++)
{
l=1;//每次循环l都要从1开始找
while (l<=n&&a[i].x-a[l].x>=mid)//超时了
{
if (a[i].y-a[l].y>=mid||a[l].y-a[i].y>=mid)
return true;
l++;
}
}
return false;
}
signed main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
cin>>a[i].x>>a[i].y;
sort(a+1,a+n+1,cmp);
int l=0,r=1e9;
while (l<r)
{
int mid=(l+r+1)>>1;
if (check(mid))l=mid;
else r=mid-1;
}
printf("%d\n",l);
return 0;
}