¿Cuál es el enfoque para resolver GSS1 y GSS3 en SPOJ usando árboles de segmentos?

Los dos problemas tienen soluciones muy similares. GSS1 es solo GSS3 sin la operación de “actualización”, así que solo explicaré cómo resolver GSS3.

Como sabes, necesitas usar un árbol de segmentos. La única pregunta es qué datos almacenar en cada nodo. Como sabe, el requisito debería ser que sea fácil calcular los datos asociados con un intervalo dado si ya conoce los datos asociados con dos subintervalos cuya unión disjunta es el intervalo dado. Afirmo que los datos que necesita son:

  • la suma máxima de subarrays no vacía,
  • la suma máxima de prefijo no vacío,
  • la suma máxima de sufijo no vacío,
  • la suma total

Para calcular la suma máxima de subarreglos no vacíos para un intervalo I que es la unión disjunta de un subintervalo izquierdo L y un subintervalo derecho R, considere tres casos:

  1. El subconjunto no vacío de suma máxima está contenido dentro de L. En ese caso, es el subconjunto no vacío de suma máxima de L, que ya conocemos.
  2. El subconjunto no vacío de suma máxima está contenido dentro de R. En ese caso, es el subconjunto no vacío de suma máxima de R, que ya conocemos.
  3. El subconjunto no vacío de suma máxima está en parte en L y en parte en R. En ese caso, debe ser la combinación del sufijo no vacío de suma máxima de L y el prefijo no vacío de suma máxima de R, que conocemos.

Para obtener la suma máxima de subarreglos no vacíos para un intervalo dado, solo tome el máximo de estos tres casos. No creo que haya mucho que demostrar aquí: no es más que el análisis de casos. Le dejo al lector cómo averiguar cómo calcular la suma máxima de prefijo no vacío y la suma máxima de sufijo no vacío para un intervalo desde los subintervalos. La suma total es, por supuesto, estándar.

Las actualizaciones son fáciles: simplemente establece los cuatro valores para un intervalo de un solo elemento al valor del elemento en sí.

Puede ver el código aquí: t3nsor / SPOJ

En este tipo de problemas, la solución completa depende de cómo combine dos nodos para formar un nodo de nivel superior. Otras operaciones como la inicialización, consulta y actualización permanecen sin cambios en casi todos los problemas del árbol de segmentos.

Aquí, se le pide que encuentre la suma de subarreglos más grande entre dos índices dados en una matriz. Por lo tanto, para un nodo de árbol de segmento, debe mantener 4 campos: izquierda, derecha, suma y mejor.
Izquierda : la mejor suma que puede obtener siempre que la submatriz comience desde el índice más a la izquierda en el intervalo.
Derecha : la mejor suma que puede obtener siempre que la submatriz termine en el índice más a la derecha del intervalo.
Mejor : la suma de subarrays más grande que puede tener en un intervalo.
Suma : Suma de todos los elementos en el intervalo.

Los valores de estos campos en los nodos hoja son triviales. Intente encontrar los valores de estos campos en el nodo de nivel superior intentando extender la suma izquierda, la suma derecha e ideando la mejor suma de los valores disponibles.

Este problema se resuelve fácilmente con árboles de segmentos. He explicado los árboles de segmentos, con soluciones para GSS1 y GSS3 aquí: un enfoque simple para segmentar árboles

Para GSS1, puede consultar mi respuesta a la pregunta ¿Cómo resuelvo GSS 1 en SPOJ usando un árbol de segmentos?

More Interesting

Cómo verificar si existe una ruta simple entre los nodos a y b de modo que pase a través del nodo c

Si una cadena de números contiene todas las demás cadenas de números, ¿eso significa que la cadena también se contiene estrictamente a sí misma?

¿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?

¿Hay alguna manera de extraer la palabra principal de una lista de sinónimos que representa la lista?

¿Debo comenzar a aprender programación de computadoras con CS50 o con un libro de estructuras de datos y algoritmos?

¿Qué es el algoritmo? ¿Para qué sirve?

Cómo planificar 1-2 años de programación para convertirse en un experto en algoritmos, suponiendo que tenga un conocimiento de C ++ en la escuela secundaria

¿Qué método es el más adecuado para resolver problemas de programación de enfermería, programación dinámica o algoritmos genéticos, y por qué?

Soy un programador promedio, me encanta codificar en Java y estoy tratando de mejorar mis habilidades de codificación algorítmica. ¿Cómo puedo mejorarlos?

Cómo resolver la siguiente recursividad usando el árbol de recursión

¿Cuál es el algoritmo de compresión de texto más utilizado en la industria?

¿Qué tecnología utiliza X ?: ¿Cómo implementan las empresas de análisis (Mixpanel, KISSMetrics, etc.) el análisis de embudos?

¿En qué situaciones alguien usaría Dijkstra sin un montón sobre Dijkstra con un montón?

¿Qué tipo de algoritmos / pruebas / procedimientos analíticos se utilizan en el comercio minorista y para estudiar el comportamiento del consumidor?

¿Puedo aplicar la optimización de algoritmos genéticos en un problema multivariable con 2 entradas frente a 2 salidas?