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:
- ¿Qué es una matriz ordenada y en qué se diferencia de una que no está ordenada?
- ¿Podría alguien explicar las etapas de un algoritmo recursivo que muestra cómo se alcanza la condición de terminación?
- ¿Cuál es el número total de rompecabezas de sudoku posibles?
- Cómo agregar un elemento a una matriz en Java
- Cómo elegir métricas de error para el algoritmo de aprendizaje automático
- Para cada posición i, encuentre b [i] = número de veces que aparece [i] en un [1 … i]
- Del mismo modo, para cada posición i, encuentre c [i] = número de veces que aparece [i] en un [i … N]
- 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:
- Dada una posición i, incremente el valor en el nodo i en 1
- 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.