Este es un problema que me gustó mucho, y quería compartirlo (?). Como el Foro es en español, voy a ponerlo en español, igual dejo el link.
Miguel y Pies
Miguel es el presidente del país Qué-Carambola. En este país viven n osos, además de Miguel. Todos los osos se encuentran parados en una fila, y están numerados de 1 a n, de izquierda a derecha. El i-ésimo oso mide a_i pies de alto.
Un grupo de osos es un segmento contiguo y no vacío de la fila. El tamaño de un grupo es la cantidad de osos que hay en el grupo. La fuerza de un grupo es la menor altura de un oso en ese grupo.
Miguel siente curiosidad de conocer para cada x entre 1 y n (ambos inclusive), cuál es la máxima fuerza que puede tener un grupo de la fila de tamaño x.
En el problema original, las cotas de la entrada son:
- n entero positivo menor o igual a 200.000
- a_i entero positivo menor o igual a 1.000.000.000
Y la salida consiste en n números, cada uno con la respuesta para cada x desde 1 hasta n
Entrada (ejemplo)
10
1 2 3 4 5 4 3 2 1 6
Salida (ejemplo)
6 4 4 3 3 2 2 1 1 1
De todas formas creo que lo interesante es pensar soluciones (eficientes o no), y discutirlas hasta entenderlas.
Invitando entonces a tirar soluciones, pongo lo que creo que es lo más directo.
Solución 1
Implementación Directa
- Resolver el problema para un tamaño x fijo
- Para todos los segmentos de tamaño x calcular el mínimo de los a_i en el segmento
- Tomar el máximo de todos estos mínimos
Complejidad
Depende de cómo resolvemos el ítem 2.
Dejo una opción:
- Para cada uno de los n valores de x, hay n-x+1 segmentos a considerar
- Recorrer cada uno de ellos para tomar mínimo nos cuesta tan largo como sea el segmento, en nuestro caso, el largo es x.
- Luego de tomar los mínimos de todos los segmentos, tomamos el máximo de todos ellos, que son n-x+1 números (uno por segmento).
Entonces, para x fijo, estamos haciendo: x \cdot (n-x+1) + (n-x+1), que podemos acotarlo por: 2x(n-x+1)
De aquí, sumando para cada x : Complejidad (e̶s̶t̶o̶ ̶e̶s̶ ̶p̶o̶r̶q̶u̶e̶ ̶n̶o̶ ̶v̶i̶ ̶c̶ó̶m̶o̶ ̶u̶s̶a̶r̶ ̶L̶a̶T̶e̶X̶ ̶) ¡Ahora sí hay \LaTeX!
$$ \sum\limits_{x = 1}^{n} 2x(n-x+1) = \frac{1}{3} n(n+1)(n+2) $$
Lo cual es \mathcal{O}(n^3)