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…
| Hecho | Fuente | Nombre | Dificultad | Tags | Solución |
|---|---|---|---|---|---|
| Gold | Springboards | Difícil | PURQ | — |
Para resolver este problema, necesitamos una estructura de datos que soporte operaciones similares a las siguientes:
- Agregar un par .
- Para cualquier , consultar el valor máximo de entre todos los pares que cumplen .
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 y en el mapa tales que y , podemos ignorar (y las respuestas a consultas futuras no se verán afectadas). Así, en todo momento, los pares que guardamos en el mapa cumplirán y .
- Consultar un cierto se puede hacer con una sola operación
lower_bound, ya que solo queremos el mínimo tal que . - Al agregar un par , primero comprobamos si ya existe en el
mapa tal que .
- Si es así, no hacemos nada.
- En caso contrario, insertamos en el mapa y borramos repetidamente pares tales que hasta que no quede ninguno.
Si hay inserciones, cada consulta toma y agregar un par toma 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 >= xSe puede consultar el análisis para la solución completa del problema original.
Problemas
| Hecho | Fuente | Nombre | Dificultad | Tags | Solución |
|---|---|---|---|---|---|
| COCI | 2018 - Deda | Fácil | PURQ | Solución | |
| Platinum | Nocross | Difícil | PURQ | — | |
| CF | Rainbow Rectangles | Muy difícil | PURQ | — | |
| CF | Karen & Cards | Muy difícil | PURQ | — | |
| CF | Interesting Drug | Muy difícil | PURQ | — |