Divida los bordes en bloques de [math] \ sqrt {n} [/ math]. Luego, puede responder la consulta para cualquier subrango de estos bloques, de los cuales hay [math] \ textstyle {{\ sqrt {n} \ choose 2}} \ aprox n / 2 [/ math]. Esto lleva [math] \ sqrt {n} [/ math] tiempo para cada una de estas subranges, ya que debe agregar un bloque al final de una subranga computada anterior para obtener una nueva subranga, por lo que en total esto toma [math] O (n \ sqrt {n}) [/ math] operaciones.
Luego, tendrá que procesar cada una de las consultas reales sin conexión. Eso significa que tendrá que leerlos todos, distribuirlos por cuál de estos subrangos se encuentran, es decir, tomar el techo del lado izquierdo y el piso del lado derecho, y luego responderlos mientras calcula estos subrangos de bloque. Para responder a cada consulta, debe agregar hasta [math] \ sqrt {n} [/ math] elementos a la izquierda y a la derecha del subrango de bloques previamente calculado. Una vez que la consulta ha sido respondida, reinicie y continúe con la siguiente consulta. El algoritmo total toma [matemática] O \ left (\ alpha (n) (n + q) \ sqrt {n} \ right) [/ math] tiempo, donde q es el número de consultas y [math] \ alpha [ / math] es la función inversa de Ackermann, que surge del uso de la estructura de datos de Disjoint-set para contar componentes.
Esta solución no es trivial para el código, ya que implica un procesamiento fuera de línea extraño y restablecer el conjunto disjunto, pero es conceptualmente más fácil que la solución alternativa de árbol de corte de enlace. Si te ayuda, puedes ver mi solución para 86D – Codeforces, que es similar.
- Cómo insertar un valor al final de una lista vinculada
- Cómo demostrar que este gráfico todavía puede estar fuertemente conectado
- ¿Cuáles son algunas formas diferentes de calcular la mediana de una matriz en Java?
- Si f (n) es O (g (n)) yf (n) es O (h (n)), entonces cuál de las siguientes afirmaciones debe ser verdadera: f (n) + g (n) es O (h (n)), g (n) + h (n) es O (f (n)), f (n) es O (g (n) + h (n)), o ninguno de los anteriores?
- Cómo aprender a utilizar el algoritmo lenguaje de programación