Vamos usar + para denotar o início de um segmento e −para denotar o fim. Para cada segmento, crie dois pares, um para cada terminal:
Segment1: (-2, +), (3, -)
Segment2: (1, +), (5, -)
Segment3: (-3, +), (1, -)
Classifique o 2Npares pela primeira coordenada (em caso de igualdade, coloque + antes -). Você pode fazer isso a tempoO(NlogN) com qualquer algoritmo de classificação razoável ou com o tempo O(N+K)usando contagem indexada por chave . No exemplo, obtemos:
(-3, +)
(-2, +)
(1, +)
(1, -)
(3, -)
(5, -)
Agora processe os pontos de extremidade em ordem. Mantenha uma contagem do número de segmentos ativos, que é inicialmente 0. Toda vez que você processa um+, aumente a contagem em 1. Toda vez que você processar um -, diminua a contagem em 1. Depois de processar cada nó de extremidade, verifique se a nova contagem é maior que a maior contagem até agora; se for, atualize sua solução.
(-3, +) -> count=1, max_count=0, sol=-3
(-2, +) -> count=2, max_count=1, sol=-2
(1, +) -> count=3, max_count=2, sol=1
(1, -) -> count=2, max_count=3, sol=1
(3, -) -> count=1, max_count=3, sol=1
(5, -) -> count=0, max_count=3, sol=1
Esta segunda fase do algoritmo leva tempo proporcional N. Todo o algoritmo leva tempoO ( NregistroN) com uma classificação genérica ou O ( N+ K) com contagem indexada por chave.
Vamos construir uma matriz de tamanho 2 * k + 1, todos inicializados com 0. Para cada segmento do formulário [L, R], adicionaremos 1 no L th index e subtrairemos 1 do R + 1 th index.
Agora, para obter o resultado, executaremos uma soma de prefixo.
Seja eu o índice com o valor máximo. Então a resposta será iK .
Vamos resolver o exemplo solicitado:
A complexidade temporal da abordagem acima será O (máx (N, K)) .
fonte