https://codeforces.com/contest/1408/problem/D
Ideias:
Existem muitas pessoas e muitos monitores, considere a enumeração.
Considere separar as coordenadas horizontais e verticais.
Enumere primeiro no monitoramento do trabalho eficaz.
Considere que para cada monitor cuja diferença de abscissa é x, a pessoa que corresponde ao monitor cuja diferença de abscissa é x precisa subir pelo menos y degraus para escapar.
Então vamos enumerar o número de passos para ir direto do máximo 1e6 a 0, qual é o número mínimo de passos que podem ir para cima + ir para a direita.
O que isso significa?
É a enumeração do número de passos da direita para a pequena. Por exemplo, se a enumeração dá x passos para a direita, então deve-se assegurar que as pessoas que podem escapar caminhando para a direita <x passos devem escapar. Então, os restantes que não conseguem escapar caminhando para a direita atualizam o valor máximo da caminhada ascendente durante o processo de enumeração, e essas pessoas escapam caminhando para cima.
Portanto, equivale a enumerar todas as situações em que o número de passos que sobem e o número de passos que vão para a direita devem ser escapados.
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=2e3+100;
typedef int LL;
struct rob{
LL x,y;
}re[maxn];
struct light{
LL x,y;
}li[maxn];
LL v[1000060];
int main(void)
{
cin.tie(0);std::ios::sync_with_stdio(false);
LL n,m;cin>>n>>m;
for(LL i=1;i<=n;i++){
cin>>re[i].x>>re[i].y;
}
for(LL j=1;j<=m;j++){
cin>>li[j].x>>li[j].y;
}
for(LL i=1;i<=n;i++){
for(LL j=1;j<=m;j++){
if(li[j].x-re[i].x>=0&&li[j].y-re[i].y>=0){
v[li[j].x-re[i].x]=max(v[li[j].x-re[i].x],(li[j].y-re[i].y+1));
//对于每个横坐标差为x的监控来说,至少需要向上走y步才能出去
}
}
}
LL ans=1e7;LL r=-1e7;
for(int i=1000000;i>=0;i--){ //注意从大到小,不然会出现不存在的情况当最小值
r=max(r,v[i]);///往右走i步时,至少向上需要多少步
ans=min(ans,r+i); //加上往右走的步数,枚举总体最小步数
}
cout<<ans<<endl;
return 0;
}