![]() |
Problema A - Pontos e Rectângulos |
Tipo de problema: Geometria
Autor do Problema: Pedro Ribeiro (DCC/FCUP)
Problema:
Dado um conjunto de pontos, quantos rectângulos que não possuem pontos no seu interior existem?
Restrições:
2 <= N <= 10 000.
1 <= Xi, Yi <= 2 000 000 000.
Solução base:
Colocar os pontos numa matriz.
Para cada par de pontos, verificar se existe algum ponto no seu interior.
Esta seria uma solução O(N^4) que daria aproximadamente 30 pontos.
Melhorar: para quê desenhar?
Obviamente que não precisamos de pesquisar todos os pontos no interior do rectângulo!
Podemos fazer o inverso, verificar se os pontos existentes estão dentro do rectângulo.
Esta seria uma solução O(N^3) que daria aproximadamente 40 pontos.
Melhorar a verificação
O próximo patamar estava reservado para aqueles programas que conseguem verificar instantaneamente se num dado rectângulo existe algum ponto.
Matriz original:
1 | 2 | 3 | 4 | 5 | 6 | |
1 | X | . | . | . | X | . |
2 | . | . | . | X | . | . |
3 | . | . | . | . | X | . |
4 | . | . | . | . | . | . |
5 | . | . | . | . | X | . |
6 | X | . | . | . | . | X |
Matriz resultante:
1 | 2 | 3 | 4 | 5 | 6 | |
1 | 1 | 1 | 1 | 1 | 2 | 2 |
2 | 1 | 1 | 1 | 2 | 3 | 3 |
3 | 1 | 1 | 1 | 2 | 4 | 4 |
4 | 1 | 1 | 1 | 2 | 4 | 4 |
5 | 1 | 1 | 1 | 2 | 5 | 5 |
6 | 2 | 2 | 2 | 3 | 6 | 7 |
A matriz de somas acumuladas permite-nos descobrir se existe algum ponto em qualquer sub-rectângulo em tempo constante! O(1)
Por exemplo, para calcular o número de pontos no rectângulo entre (3, 2) e (5, 5):
m[5][5] - m[2][5] - m[5][1] + m[2][1]
Esta seria uma solução O(N^2) em tempo, mas também O(N^2) em memória, pelo que daria 60 pontos.
Out of the box
Como manter a pesquisa em O(N^2) mas garantir que usamos menos de 32MB?
Ordenamos os pontos por uma coordenada (por exemplo Y), e para cada ponto verificamos: