Editorial for Zamjene
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Usaremos la estructura de datos union-find para resolver esta tarea.
Primero describamos la solución que no es lo suficientemente rápida, pero que sirve como motivación para el
solución real.
¿Qué datos se deben recordar en cada componente?
Cada componente corresponde a un conjunto de posiciones.
Denotemos el conjunto múltiple de todos los valores contenidos en la matriz  en las posiciones contenidas en la componente 
 como 
, y el conjunto múltiple de todos los valores contenidos en el arreglo ordenado 
 en
posiciones contenidas en la componente 
 como 
.
Al unir los componentes 
 y 
 en un nuevo componente 
, vemos que \(P_C = P_A ∪ P_B\) y
\(Q_C = Q_A ∪ Q_B\). Es crucial notar que el arreglo se puede ordenar si y solo si 
 se cumple para cada componente.
Después de esto, podemos notar que no es necesario recordar los conjuntos múltiples de números exactos,
sino solo sus valores hash. Si el número  está contenido 
 veces en multiset 
, el número 
 
 veces,
... 
 
 veces, entonces definimos el valor hash del conjunto S como:
Al unir componentes, simplemente agregamos los valores hash de las componentes originales.
Sin embargo, todavía no hemos mencionado cómo responder a la consulta número 4.
De hecho, queremos saber el número de pares que contiene:
 (donde ahora 
 y 
 denotan los valores hash)
Entonces
Ahora sabemos cómo responder a la consulta manteniendo el mapa 
 donde 
 nos dice cuántos
nodos hay con la diferencia de 
 siendo exactamente 
.
La complejidad temporal de esta solución es 
.
Comments