タイトルの意味:n ∗ mn * mを
与えるn∗m場所、人の家、bレストランでは、人が家からレストランに到着するのに必要な最小時間と最長時間を調べることができます。
アイデア:
境界を分割して見つけることの問題です。各レストラン(l、r)を原点として使用すると、n ∗ mn * m全体がn∗mの面積は4つの象限に分割されます。そして、私たちが必要とする最大値、つまりコーナー(x、y)は、家が私たちが必要とする結果になることを示しています。
- 第1象限の最長時間はx− l + y − r x-l + yrです。バツ−l+Y−r
- 第2象限の最長時間はl− x + y − r l-x + yrです。l−バツ+Y−r
- 第3象限の最長時間はl− x + r − y l-x + ryです。l−バツ+r−Y
- 第4象限の最長時間はx− l + r − y x-l + ryです。バツ−l+r−yの
単純な点は、横軸の差の絶対値に縦座標の差の絶対値を加えたものです。彼を分離する理由は、これがコーナーを数えるだけで時間を最適化するからです。作って、組み合わせて、家をまとめて、レストランをまとめて
(1)第1象限の最長時間は(x + y)+(− l − r)(x + y)+(-lr)です。(x+および)+(− l−r )
(2)。第2象限の最長時間は(− x + y)+(l − r)(-x + y)+(lr)です。(− x+および)+(l−r )
(3)。第3象限の最長時間は(− x − y)+(r + l)(-xy)+(r + l)です。(− x−および)+(r+l )
(4)。第4象限の最長時間は(x − y)+(− l + r)(xy)+(-l + r)です。(x−および)+(− l+r )
実際、
上記の組み合わせで同じタイプ(水平記号と垂直記号が反対で距離が距離になる)であることがわかります。最も遠い点は4つのコーナー点にある必要があります。最初に見つけます。 out(− l − r)、(l − r)、(− l + r)、(l + r)(-lr)、(lr)、(-l + r)、(l + r)(− l−r )、(l−r )、(− l+r )、(l+r )これらの4つのグループの最大値を見つけ、次に各レストランの対応する(x、y)を追加して、これらの4つの状態の最大値が私たちが探しているポイントであることを見つけ、それを最小化します。
#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;
}