D. Holofotes (pensamento + distância de enumeração)

 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;
}

 

Acho que você gosta

Origin blog.csdn.net/zstuyyyyccccbbbb/article/details/108897449
Recomendado
Clasificación