​跟着大佬的步伐​

​题目链接​

题意:
给出你一个CodeForces - 491B. New York Hotel(数学)_i++的地方,其中a个人的家,b个饭店,让你求出a个人都从家出发到达一个饭店,需要的最长时间最小是多少且第几个饭店。
思路:
是一个分割找边界问题,如果以每个饭店(l,r)为原点的话那么就可以把整个CodeForces - 491B. New York Hotel(数学)_i++的地方分成四个象限。而应我们要求的最大值,也就是边角(x,y)表示家会成为我们要求的结果,

  1. 对于第一象限最长时间是CodeForces - 491B. New York Hotel(数学)_i++_03
  2. 对于第二象限最长时间是CodeForces - 491B. New York Hotel(数学)_#include_04
  3. 对于第三象限最长时间是CodeForces - 491B. New York Hotel(数学)_c++_05
  4. 对于第四象限最长时间是CodeForces - 491B. New York Hotel(数学)_#include_06
    说简单点就是横坐标差绝对值加上纵坐标差绝对值。之所以把他分开是因为这样会优化时间,只算边角就行。在化一下,结合一下,把家的放一起,把饭店的放一起

(1). 对于第一象限最长时间是CodeForces - 491B. New York Hotel(数学)_c++_07
(2). 对于第二象限最长时间是CodeForces - 491B. New York Hotel(数学)_c++_08
(3). 对于第三象限最长时间是CodeForces - 491B. New York Hotel(数学)_#include_09
(4). 对于第四象限最长时间是CodeForces - 491B. New York Hotel(数学)_c++_10
其实可以看出同一类型的(横纵符号是相反的这样才是距离)
通过上面的结合,我们就得到最远点一定在 这四个边角点,就先找出CodeForces - 491B. New York Hotel(数学)_i++_11这四组的最大值找出来,然后再加上每个饭店对应的(x,y)求出这四个状态的最大值就是我们要找的那个点,然后再最小化就可以了。

#include<bits/stdc++.h>
using namespace std;
long long sum,ans;
int x[50],y[50];
int main() {
int n,m,l,r,u,v;
cin>>u>>v;
cin>>n;
for(int i=1; i<=4; i++) {
x[i]=-1e9+7;
}

for(int i=1; i<=n; i++) {
scanf("%d%d",&l,&r);
x[1]=max(x[1],-l-r);///第一象限
x[2]=max(x[2],l-r);///第二象限
x[3]=max(x[3],l+r);///第三象限
x[4]=max(x[4],-l+r);///第四象限
}
cin>>m;
int ans=2e9+7,res;
for(int i=1; i<=m; i++) {
scanf("%d%d",&l,&r);
int sum=0;
sum=max(sum,x[1]+l+r);///第一象限
sum=max(sum,x[2]-l+r);///第二象限
sum=max(sum,x[3]-l-r);///第三象限
sum=max(sum,x[4]+l-r);///第四象限
if(sum<ans) {
ans=sum;
res=i;
}
}
cout<<ans<<endl<<res<<endl;
return 0;
}