Editorial for C-3BA y las Subsecuencias
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Subtarea 1:
Denotemos como la cantidad de subsecuencias de que cumplen con las condiciones y terminan en (el otro elemento de la subsecuencia es ).
Similarmente, será la cantidad de subsecuencias de que cumplen con las condiciones y terminan en (el otro elemento de la subsecuencia es ).
Realizando un ciclo de a , en cada paso se puede notar que:
Si :
- (ya que no hay ninguna subsecuencia nueva que termine en )
- (las anteriores, o las que terminaban en 2, añadiendole el actual )
Similarmente, si :
- (ya que no hay ninguna subsecuencia nueva que termine en )
- (las anteriores, o las que terminaban en 1, añadiendole el actual )
Finalmente, la respuesta es .
Tiempo , memoria .
Subtarea 2:
En esta subtarea es suficientemente pequeño para probar todos los subconjuntos, por ejemplo usando máscaras de bits para simular cada subconjunto, y en cada uno de ellos realizar un ciclo para chequear que cumpla las condiciones del problema.
Tiempo , memoria .
Subtarea 3:
En esta subtarea, podemos probar para cada par tal que y , y para cada uno de ellos contar la cantidad de secuencias que cumplen las propiedades que los contienen como elementos, para un par específico podemos usar la misma solución de la subtarea 1.
Tiempo , memoria
Subtarea 4: Cada número aparece a lo más dos veces en el arreglo.
Como cada número aparece a lo más dos veces en el arreglo, las subsecuencias que cumplan las propiedades tendrán longitud a lo más 4, veamos para cada longitud en específico como contar la cantidad de subsecuencias de esta longitud.
Denotemos como la primera vez que aparece el elemento en el arreglo (si aparece) y como la segunda vez que aparece el elemento en el arreglo (si aparece dos veces)
- Subsecuencias de longitud 2, cada par de elementos diferentes del arreglo, lo cual se puede contar de manera sencilla con dos ciclos.
- Subsecuencias de longitud 3, seguirán el patrón , para cada par tal que y , habrán de estas secuencias (cualquier elemento entre ellos será diferente, y entre los 3 formarán una subsecuencia válida), se puede contar con dos ciclos chequeando los pares de elementos iguales y contando.
- Subsecuencias de longitud 4, seguirán el patrón , para cada par tal que , y y aparecen dos veces, existe una ocurrencia de este tipo si y solo si , se puede contar con dos ciclos sobre y , y luego de manera sencilla para cada par se chequea si forman o no una subsecuencia de este tipo.
Tiempo , memoria
Subtarea 5: Sin restricciones adicionales.
Denotemos como la cantidad de subsecuencias que terminan en , el penúltimo elemento es y están contenidas en .
Procesemos todos los elementos de izquierda a derecha, así podremos calcular basado en , las transiciones serían:
- si .
Una implementación ingenua de esta tomaría tiempo y memoria, pero la dimensión de no es necesaria, simplemente es la cantidad de subsecuencias que terminan en , el penúltimo elemento es , y están contenidas en el prefijo que hemos procesado. Las transiciones son aproximadamente las mismas, la primera transición no es necesaria ahora (iría de un estado a si mismo), con esto se obtiene una solución en tiempo y memoria, en cuanto a tiempo es suficiente, pero usa demasiada memoria (el límite del problema es 16 MB).
Trucos usuales de ahorrar memoria no funcionan de manera ingenua, por lo cual intentaremos hacer un ciclo sobre cada elemento y contar la cantidad de subsecuencias válidas que terminan en .
Denotemos como la cantidad de subsecuencias que terminan en , y su otro elemento es , y la cantidad de subsecuencias que terminan en , y su otro elemento es .
Procesamos todos los elementos de izquierda a derecha (noten que hemos fijado antes), las transiciones serían:
- si (esta transición se hace en )
- , para todo si (esta transición se hace en , pero en total se hará veces porque hemos fijado y solo la hacemos si )
Luego de procesar todos los elementos de izquierda a derecha, añadimos a la solución.
Luego de fijar cada posible , tendremos la respuesta del problema.
Tiempo , memoria .
Comments