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