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 a≥xa\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 a≤ca\le c y b≤db\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 ai≥xa_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 a≥a′,b≥b′a\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 a≤a′,b≤b′a\le a', b\le b' hasta que no quede ninguno.

Si hay NN inserciones, cada consulta toma O(log⁡N)\mathcal{O}(\log N) y agregar un par toma O(log⁡N)\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—