En el algoritmo de Mo, ¿por qué clasificamos las consultas primero en función del número de bloque y luego (si hay un empate) en función del punto final derecho? ¿Cuál es la intuición detrás de esto?

La intuición detrás es realmente simple. Créame.

El algoritmo es más adecuado para problemas de consulta de rango sin actualizaciones en los que agregar o eliminar el índice de esquina en el rango actual es [matemática] O (1) [/ matemática] o [matemática] O (logn) [/ matemática] o similar.

Ahora, queremos minimizar tales operaciones de tal manera que garantice un límite superior en la cantidad de veces que se llama a estos add () o remove ().

Para cada consulta, el puntero izquierdo se moverá como máximo del tamaño del bloque, es decir, [math] O (\ sqrt {n}) [/ math]. Esto se debe a que para cada consulta con el puntero izquierdo en el mismo bloque, podemos movernos del puntero izquierdo actual al puntero izquierdo requerido en el tamaño del bloque número de pasos.

Para cada bloque, el punto final correcto aumenta monotónicamente. Esto garantiza que escaneemos todas las consultas en una sola pasada. Esto limita el número de desplazamientos del puntero derecho a [matemática] O (n) [/ matemática] para cada bloque. Hay [math] O (\ sqrt {n}) [/ math] tales bloques, que limitan el número de tales llamadas a [math] O (n \ sqrt {n}) [/ math].

En este punto, el resto no debería ser difícil. Al comenzar a procesar consultas para el siguiente bloque, podemos contar el costo de arranque del rango actual en los dos costos anteriores. Por lo tanto, esto no agrega ninguna complejidad adicional.

Resumiendo, [math] O (\ sqrt {n}) [/ math] para cada consulta para el puntero izquierdo y O (n) para cada bloque para el puntero derecho. Esto multiplicado con la complejidad de agregar y quitar nos da la complejidad general: [matemáticas] O (n \ sqrt {n} + q \ sqrt {n}) [/ matemáticas].

Glosario:

  1. n es el tamaño de la matriz
  2. q es el número de consultas
  3. add () o remove () es O (1)

Referencia: Algoritmo de MO (consulta de descomposición de raíz cuadrada)