Advertisement
Guest User

CIIC - Circuitos Editorial

a guest
Aug 7th, 2021
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.32 KB | None | 0 0
  1. Solución Esperada
  2.  
  3. Lo primero que podemos hacer es convertir el problema en uno de
  4. conjuntos. Siendo cada entrada un conjunto (conformado por los
  5. tiempos en los que se envía corriente por esta entrada), luego
  6. cada una de las compuertas se convierte en una operación entre
  7. conjuntos.
  8.  
  9. Las compuertas AND se convierten en la intersección de conjuntos,
  10. las compuertas OR en la unión de conjuntos y las compuertas XOR en
  11. la diferencia simétrica de conjuntos. Finalmente, las luces LED
  12. simplemente indican responder el conjunto que devuelve alguna de
  13. las compuertas.
  14.  
  15. Para resolver el problema, lo que voy a querer es que cada una de
  16. estas operaciones pueda realizarse solamente iterando por los
  17. elementos del conjunto de menor tamaño. Notar que la mayor
  18. cantidad de operaciones se realiza si todas las compuertas son OR,
  19. ya que conservan todos los elementos de ambos conjuntos. Por
  20. tanto, acotar la cantidad de operaciones en este caso acota la
  21. cantidad de operaciones realizadas en el problema.
  22.  
  23. Para acotar este caso, noto que si itero un elemento solamente
  24. cuando pertenece al conjunto de menor tamaño, después de la
  25. operación el tamaño del conjunto al que pertenece se duplica (como
  26. mínimo). Como ningún conjunto puede tener más de los M elementos
  27. iniciales, entonces el tamaño se puede duplicar hasta log 2 (M)
  28. veces. Por tanto, cada uno de los M elementos puede ser visto
  29. hasta log 2 (M) veces. En total, la
  30. complejidad resulta en
  31. O(M*log 2 (M)*O(T)), donde O(T) es la complejidad asociada a iterar
  32. cada elemento.
  33.  
  34. Ahora vemos como realizar cada una de las 3 operaciones en una
  35. complejidad dependiente del tamaño del elemento más chico:
  36.  
  37. * AND: Debo crear un nuevo conjunto, inicialmente vacío. Luego,
  38. itero el conjunto más pequeño y para cada conjunto, si
  39. pertenece también al más grande lo incorporó al nuevo
  40. conjunto. La respuesta queda almacenada en el nuevo conjunto.
  41.  
  42. * OR: Itero los elementos del conjunto más chico y los agrego
  43. al conjunto más grande. La respuesta queda almacenada en el
  44. conjunto más grande.
  45.  
  46. * XOR: Itero los elementos del conjunto más chico y, si ya
  47. pertenecen al conjunto más grande, los elimino, y si no, los
  48. agrego. La respuesta queda almacenada en el conjunto más
  49. grande.
  50.  
  51. Notar que, a nivel implementativo, hay que evitar copiar los
  52. conjuntos para realizar las operaciones. Para esto pueden usarse
  53. índices a un array de conjuntos o bien punteros, según preferencia
  54. del concursante (la solución oficial utiliza punteros)
  55. La O(T) va a depender de si utilizamos set o unordered_set (o sus
  56. análogos en otros lenguajes) para representar los conjuntos, ya
  57. que la O(T) es básicamente el costo de ver si un elemento
  58. pertenece a otro conjunto, agregarlo o eliminarlo.
  59.  
  60. Igual, notar que por la implementación interna de estas estructuras de datos el
  61. tiempo de ejecución puede ser similar en ambos casos.
  62. Finalmente, la complejidad resultante puede ser O(M*log 2 (M)) o O(M*log(M)).
  63.  
  64. Soluciones Parciales
  65.  
  66. En todas las soluciones parciales se toma que estamos trabajando
  67. con un problema de conjuntos y operaciones sobre conjuntos, como
  68. se explicó para la solución esperada.
  69.  
  70. Para la subtarea 1<=N,M<=500 se espera que cada conjunto sea
  71. representado con vectores, y que la búsqueda de si un elemento
  72. pertenece o no a un conjunto se realice en tiempo lineal, pudiendo
  73. llegar a costar O(M^2 ) cada operación. También abarca soluciones que
  74. copien los conjuntos para utilizarlos, o que representen los
  75. conjuntos con set o unordered_set, pero no presten atención al
  76. tamaño de los conjuntos para optimizar la cuenta.
  77. La complejidad de estas soluciones va en el orden de O(M^3 ) a O(M^2 )
  78. (aunque con alta constante, comparable a O(M^2 *log(M)))
  79.  
  80. Las 3 subtareas donde solo se toma una de las compuertas son para
  81. evaluar de forma independiente la resolución de las mismas, viendo
  82. que aunque son similares cada una es un problema independiente de
  83. las otras 2.
  84.  
  85. La subtarea donde 1<=input i,j <=5.000 está planteada para que los
  86. competidores implementen las operaciones utilizando bitset de C++
  87. o máscara de bits. En este caso la complejidad queda
  88. O(N*(5.000/64)), siendo (5.000/64) el costo de las operaciones
  89. utilizando bitset. (puede variar ligeramente según la
  90. implementación y el compilador, pero en todos los casos es de un
  91. orden aceptable)
  92.  
  93. Autor: Lautaro Lasorsa
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement