Skip to Content

Consulta de máximo en sufijo solo con inserciones

Nota: esto estaba originalmente en Oro, pero los problemas de práctica eran demasiado difíciles…

HechoFuenteNombreDificultadTagsSolución
GoldSpringboardsDifícilPURQ

Para resolver este problema, necesitamos una estructura de datos que soporte operaciones similares a las siguientes:

  1. Agregar un par (a,b)(a,b).
  2. Para cualquier xx, consultar el valor máximo de bb entre todos los pares que cumplen axa\ge x.

Esto se puede resolver con un Árbol de Segmentos, pero una opción más simple es usar un mapa. Nos apoyamos en el hecho de que si existen pares (a,b)(a,b) y (c,d)(c,d) en el mapa tales que aca\le c y bdb\le d, podemos ignorar (a,b)(a,b) (y las respuestas a consultas futuras no se verán afectadas). Así, en todo momento, los pares (a1,b1),(a2,b2),,(ak,bk)(a_1,b_1),(a_2,b_2),\ldots,(a_k,b_k) que guardamos en el mapa cumplirán a1<a2<<aka_1 < a_2 < \cdots < a_k y b1>b2>>bkb_1 > b_2 > \cdots > b_k.

  • Consultar un cierto xx se puede hacer con una sola operación lower_bound, ya que solo queremos el mínimo ii tal que aixa_i\ge x.
  • Al agregar un par (a,b)(a',b'), primero comprobamos si ya existe (a,b)(a,b) en el mapa tal que aa,bba\ge a', b\ge b'.
    • Si es así, no hacemos nada.
    • En caso contrario, insertamos (a,b)(a',b') en el mapa y borramos repetidamente pares (a,b)(a,b) tales que aa,bba\le a', b\le b' hasta que no quede ninguno.

Si hay NN inserciones, cada consulta toma O(logN)\mathcal{O}(\log N) y agregar un par toma O(logN)\mathcal{O}(\log N) amortizado.

Implementación

#define lb lower_bound map<int, ll> m; void ins(int a, ll b) { auto it = m.lb(a); if (it != end(m) && it->s >= b) return; it = m.insert(it, {a, b}); it->s = b; while (it != begin(m) && prev(it)->s <= b) m.erase(prev(it)); } ll query(int x) { auto it = m.lb(x); return it == end(m) ? 0 : it->s; } // it = end(m) means that no pair satisfies a >= x

Se puede consultar el análisis  para la solución completa del problema original.

Problemas

HechoFuenteNombreDificultadTagsSolución
COCI2018 - DedaFácilPURQSolución
PlatinumNocrossDifícilPURQ
CFRainbow RectanglesMuy difícilPURQ
CFKaren & CardsMuy difícilPURQ
CFInteresting DrugMuy difícilPURQ