Cómo obtener el bloque consecutivo más largo de elementos iguales dentro de un rango usando árboles de segmentos

Necesita tres datos por nodo:

  1. el bloque contiguo máximo de elementos iguales: necesitamos el valor que tienen estos elementos y el recuento. Por lo tanto, dos enteros.
  2. el elemento más a la izquierda ‘L’ de un segmento, y el bloque contiguo máximo a partir del extremo izquierdo que tiene el valor ‘L’: necesitamos el valor que tienen estos elementos, y la cuenta. Por lo tanto, dos enteros.
  3. el elemento más a la derecha ‘R’ de un segmento, y el bloque contiguo máximo que termina en el extremo derecho tiene el valor ‘R’: necesitamos el valor que tienen estos elementos, y el conteo. Por lo tanto, dos enteros.

Digamos que necesitamos consultar un rango [2,7] cuando la longitud de la matriz de entrada = 8.

Por lo tanto, el árbol de segmentos consultará estos segmentos: [2,2] + [3,4] + [5,6] + [7,7]. Puede dibujar un árbol de segmentos para la longitud de entrada n = 8, y verificar esto.

Entonces, cuando combinamos los resultados de dos segmentos consecutivos como [2,2] + [3,4], [3,4] + [5,6], etc., podemos obtener el máximo de estos:

  1. El máximo de información # 1 en ambos segmentos.
  2. El resultado combinado de la información n. ° 3 del segmento izquierdo y la información n. ° 2 del segmento derecho. Si el valor del elemento con el que termina el segmento izquierdo == el valor del elemento con el que comienza el segmento derecho, entonces podemos devolver el recuento agregado.

Para aplicar el árbol de segmentos para obtener alguna propiedad x de cualquier segmento dado de elementos consecutivos, generalmente esta condición debe cumplir: Si ya hemos conocido la propiedad x de 2 segmentos [L, M] y [M + 1, R], propiedad x del segmento [L, R] podría implicarse a partir de ellos.

Vuelve a tu problema. Si la propiedad x para un segmento dado [L, R] es el número de elementos iguales consecutivos más largos (denotados como f (L, R)) en ese segmento, la condición anterior no se cumple. Pero alguna información adicional podría ayudar.

¿Cómo son los elementos iguales consecutivos más largos en un segmento [L, R]? Hay 3 casos.

Caso 1: se encuentra completamente en el segmento [L, M]. En este caso, también son los elementos iguales consecutivos más largos en el segmento [L, M], f (L, R) = f (L, M).

Caso 2: se encuentra completamente en el segmento [M + 1, R]. En este caso, también son los elementos iguales consecutivos más largos en el segmento [M + 1, R], f (L, R) = f (M + 1, R).

Caso 3: Se encuentra en ambos segmentos [L, M] y [M + 1, R], por lo que los elementos en M y M + 1 pertenecen a él. Por lo tanto, los elementos en M y M + 1 son iguales, f (L, R) = e (L, M) + s (M + 1, R) donde e (u, v) es la longitud de los elementos iguales consecutivos más largos en segmento (u, v) que termina en v; s (u, v) es la longitud de los elementos iguales consecutivos más largos en el segmento (u, v) que comienza en v.

Entonces, para un segmento dado [L, R] calcularemos 3 valores: f (L, R), s (L, R), e (L, R). Similar a f (L, R), s (L, R) y e (L, R) se pueden calcular fácilmente a partir de información sobre 2 segmentos [L, M] y [M + 1, R].

No diré la solución completa, aunque puedo dar una pista, trate de calcular de abajo hacia arriba en el árbol de segmentos y almacene los resultados en nodos intermedios a medida que avanza hacia la raíz del árbol de segmentos. Esto resolvería el problema, trate de pensar en esta pista.