Cómo resolver este problema usando árboles de segmentos

La pregunta es esencialmente esta:

Dada una matriz a [1 … N], encuentre el número de pares de posiciones (i, j) tal que i <j y el número de veces que aparece [[i] en a [1 … i] es mayor que el número de veces aparece una [j] en una [j … N].

Lo natural sería:

  1. Para cada posición i, encuentre b [i] = número de veces que aparece [i] en un [1 … i]
  2. Del mismo modo, para cada posición i, encuentre c [i] = número de veces que aparece [i] en un [i … N]
  3. Encuentre el número de pares de índices (i, j) de modo que i c [j]

El paso 1 se puede lograr fácilmente clasificando. Ordene los pares (valor, posición) en la matriz en orden lexicográfico. Las posiciones con el mismo valor terminarán contiguas, y byc pueden calcularse utilizando las posiciones dentro de las piezas contiguas.

Para el paso 3, podemos usar un árbol de segmentos que permite la actualización puntual de valores y sumas de intervalos de consulta. Para ser precisos, el árbol de segmentos debe admitir las dos operaciones:

  1. Dada una posición i, incremente el valor en el nodo i en 1
  2. Dada una posición i, devuelve la suma de valores en los nodos [i … N]

Inicialmente, todos los nodos del árbol de segmentos tienen valor 0. Ordene todos los elementos de las matrices byc (junto con sus posiciones y tipo b / c) juntos en el orden ascendente de valor. Rompa los lazos colocando los elementos b antes que los elementos c, no importa cómo se rompan los lazos entre los elementos b (o c) del mismo valor. Atraviesa esta matriz ordenada. Cuando encuentre c [i], incremente el valor en el nodo i del árbol de segmentos. Cuando encuentre b [i], tenga en cuenta que todos los elementos c con un valor más bajo ya se han actualizado. Esto significa que el número de nodos entre [i + 1 … N] que se han establecido en 1 son exactamente aquellos con j> i y c [j] <c [i]. Su número es solo la suma de valores en los nodos [i + 1 … N], que se pueden encontrar en el árbol de segmentos.

Acumule las sumas para todos los valores de b [i], y obtendrá la respuesta requerida.

More Interesting

¿Qué significa importar en Python? ¿Puedo hacer mi propio algoritmo sin usar importar?

En programación de computadoras, ¿cómo es recursivo el proceso de evaluación?

¿Qué es un buen libro sobre las estructuras de datos de Java?

¿En qué tipo de índices de búsqueda y enfoque se debe trabajar para un sitio web con búsqueda basada en la ciudad (y localidad) de una palabra clave, un ejemplo típico es un directorio web?

¿Cómo determino la complejidad temporal de una expresión matemática que involucra potencias, divisiones y exponenciales? Sé la complejidad temporal de las operaciones simples, pero no sé cómo se supone que las combino para encontrar la respuesta.

¿Podemos aplicar Ford-Fulkerson a un gráfico de múltiples fuentes y sumideros múltiples?

Cómo escribir algoritmos de mapas de ruta como Google Maps

¿Cómo se diseña el algoritmo de búsqueda difusa en Sublime Text? ¿Cómo diseñarías algo similar?

Cómo aprender algoritmos y estructuras de datos como estudiante de secundaria

En Kaggle Competition, ¿qué algoritmo de aprendizaje por conjuntos prefiere? ¿Voto mayoritario, promedio ponderado o algunos algoritmos avanzados como el embolsado?

¿Cuáles son los mejores libros para aprender estructuras de datos y algoritmos para un principiante con poco lenguaje de programación de C?

¿Cómo diferenciar entre algoritmos de clasificación internos y externos en términos simples? ¿Cómo se lo explica a los principiantes?

¿Cuál es el algoritmo detrás de las OTP (contraseñas de un solo uso)?

¿Qué compañías necesitan algoritmos de flujo óptico fuertes?

¿Cuáles son las aplicaciones de la estructura de datos de conjuntos disjuntos?