¿Cuál es la solución a este problema algorítmico que involucra gráficos y estructuras de datos?

Como mencionó Johnny Ho, puede hacer esto usando árboles dinámicos ( es decir, árboles cortados por enlaces), pero esto lo complica demasiado, porque el problema aquí solo involucra caminos, no árboles.

Como resultado, el documento original sobre Dynamic Trees en realidad introduce una estructura de datos más simple llamada rutas dinámicas, que comprende árboles dinámicos. Y, lo adivinaste, las rutas dinámicas se aplican perfectamente aquí por sí mismas.

Para implementar rutas dinámicas, puede usar cualquier BST que admita división y fusión. Por ejemplo, un árbol Splay. (Para dividir, simplemente extienda el nodo donde desea dividir a la raíz, luego corte el árbol en dos en la nueva raíz).

Usted representa una ruta como BST cuyos nodos se asignan a nodos de su ruta, en orden BST. Cuando una persona adquiere una ventaja, puede hacer que dos caminos se fusionen. Luego simplemente fusiona los BST correspondientes. Del mismo modo, cuando una persona pierde una ventaja, ¡simplemente divide el BST en el lugar apropiado! Hecho.

Puede hacer esto con un árbol de Enlace / corte en [math] O (\ log n) [/ math] por operación, manteniendo dicho árbol para cada propietario. Sin embargo, esto es excesivo para el problema dado, ya que las restricciones del problema son mucho más simples y solo requieren el mantenimiento de cadenas en lugar de árboles.