Editorial for Mezclando Árboles
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Primero para cada componente conexa del grafo dado es necesario hallar una bipartición de la misma, esto se puede hacer usando BFS o DFS. Definimos al valor de una componente conexa como el valor absoluto de la diferencia entre la cantidad de nodos de color negro y la cantidad de nodos de color blanco, se puede demostrar que no importa que bipartición se halle esta diferencia se mantiene constante.
Como hay que lograr que el grafo sea conexo hay que añadir, si hay componentes, al menos aristas, nota que solo es necesario añadir exactamente conectando cada componente a la siguiente, por ejemplo. No hacen falta más ya que una vez que sea conexo el grafo la cantidad de nodos blancos y negros no va a variar aunque se añadan más aristas (de tal forma que el grafo al final sea bipartito, claro).
Ahora para unir dos componentes cualesquiera se puede o coger un nodo negro de la primera y unirlo con uno blanco de la segunda o coger un nodo blanco de la primera y unirlo con uno negro de la segunda.
Si nos olvidamos del valor absoluto el problema se convierte en que hay componentes y para cada una se puede elegir uno de los conjuntos a ser blanco y el otro negro y se quiere hacer esto de tal forma que la suma de la cantidad total de nodos blancos menos la suma de la cantidad total de nodos negros sea lo más cercano a posible (podría ser negativo este valor).
Esto es equivalente a tener objetos y el costo de cada uno es la diferencia entre blancos y negros, llamemos a estos costos entonces lo que se puede hacer es coger un subconjunto de estos y cambiarles el signo (esto sería invertir el coloreo en la componente) tal que la suma total de los costos sea lo más cercano a .
Esto se puede hacer con DP, que es muy parecido al problema de la mochila. Lo que hay que realizar algunas optimizaciones para que entre en el tiempo límite. Por ejemplo primero se ordenan estos costos y los costos iguales se procesan juntos, ahora si un costo se repite veces entonces se puede pasar del estado a , pero además se puede notar que si ya se pudo llegar a un estado (haciendo este proceso) significa que se pudo llegar también a por lo que se pueden parar las transiciones al pasar esto.
Haciendo estas cosas se logra que el problema entre en tiempo.
Complejidad: como demuestra en el comentario de abajo.
Comments
Bueno, la complejidad de la solución propuesta es de hecho , en un momento lo voy a demostrar. Mi intento de solución durante el concurso también tenía esta complejidad, pero no pude hacerlo entrar en tiempo. Mi anális fue similar al explicado aca, pero con algunos cambios. Primero por cada componente al encontrar una coloración de este supongamos que la diferencia (con signo) entre los nodos de un color menos los del otro es . Ahora podemos tomar este valor de para adicionar a la solución, o el valor de . Vamos a tomar , pero si en un futuro quisieramos cambiar la selección en este componente, solo tendriamos que adicionar al resultado. Así que tenemos una diferencia inicial y un conjunto de valores donde es la cantidad de componentes conexas. Supongamos que la suma de los escogidos en , tendriamos que encontrar el valor más proximo a que puedo lograr tomando algunos de los (cada solo puede ser tomado a lo sumo una vez). Para esto podriamos hacer una mochila con los y ver cual es la suma mas proxima a que puedo alcanzar. Pero esto tiene complejidad y como tendríamos una solucion cuadrática, que no da en tiempo. La idea a explotar que a pesar que pueden existir 's entre los valores de estos solo puede haber valores diferentes. Si iteramos por estos valores diferentes y logramos actualizar la respuesta en para cada uno de estos valores tendriamos la complejidad requerida. Entonces hacemos como esta explicado en la editorial, supongamos que tenemos el valor de acurriendo veces, si tenemos un array si la suma puede ser lograda, entonces para actualizar estos , procesamos el array en orden decreciente de , y si encontramos que un valor es posible lograrlo entonces procedemos a actualizar a los en con el valor , pero si encontramos que en un paso de esta actualizacion que un valor de estos ya esta actualizado entonces no continuamos a actualizar los siguientes, porque este valor ya habra actualizado los valores que podrian modificarse. Entonces tenemos que el procesado para un valor de no es sino que es ya que solo visito a lo sumo valores falsos en y a lo sumo valores true. Es posible lograr la misma complejidad en este paso de la mochila de otras formas, pero parece que la constante es mayor, y en mis intentos durante el concurso no se me occurrio cambiar esta parte. PS: No se como lograr que aparezcan los latex sin que ocurran en una sola linea.
off-topic: las fórmulas deben escribirse entre dos ~. En este caso ya las arreglé para que se muestren correctamente. Saludos.