Module: Patrones en Programación Dinámica


Problem

5 /7


Restaurante

Theory Click to read/hide

Descargo de responsabilidad: el método que se describe a continuación no es universal, pero a menudo puede resolver un problema o ayudarlo a encontrar la solución correcta.

Si hay un conjunto de brechas ubicadas en algún eje (generalmente el eje del tiempo o índices de alguna matriz) y necesita elegir algunas de ellas de manera óptima para que las brechas seleccionadas no se crucen, entonces debe intentar usar programación dinámica .

Esquema de solución aproximado:

Inicialmente, ordenamos los espacios disponibles por el borde derecho. Comencemos con la siguiente dinámica: dp[i] - la respuesta para los primeros intervalos i. 
Recalcularemos de la siguiente manera: primero, considere la situación de que este intervalo no se usará, luego solo dp[i] = dp[i-1]. Tenga en cuenta que esto asegura que los valores de dp[i] no disminuyan a medida que i crece. Y esto es lógico, porque. agregando una nueva brecha, no podemos empeorar la respuesta global: o simplemente ignoramos la nueva brecha, o construimos una variante más rentable usándola. Ahora, si queremos usar el espacio i-ésimo, entonces podemos usar esos espacios cuyos bordes derechos son menores que el borde izquierdo del espacio actual, ya que debemos elegir un conjunto de espacios que no se superpongan. Para hacer esto, inicialmente clasificamos los espacios por el borde derecho, de modo que ahora podamos encontrar de manera eficiente la posición requerida. Esto se puede hacer analíticamente, si es posible, pero en el caso general es posible encontrar una brecha con un binsearch, cuyo borde derecho es menor que el borde izquierdo del actual y, al mismo tiempo, el máximo posible. uno. Queremos maximizar el borde derecho por razones codiciosas, porque a medida que crece, la respuesta solo puede aumentar. En consecuencia, encontramos la posición p requerida y recalculamos dp[i] a través de dp[p] y el i-ésimo intervalo.

Problem

El restaurante recibió n pedidos para un banquete. Cada pedido se caracteriza por dos valores: la hora de inicio del banquete li y la hora de finalización ri (li ≤  r i).

La dirección del restaurante puede aceptar el pedido o rechazarlo. ¿Cuál es el número máximo de pedidos que se pueden aceptar?

No pueden cruzarse dos órdenes aceptadas, es decir, no debe haber un punto en el tiempo que pertenezca a dos órdenes aceptadas a la vez. Si uno de los pedidos comienza al mismo tiempo que el otro finaliza, no se pueden aceptar juntos.

Entrada:
La primera línea contiene un número entero n (1 ≤ n ≤ 200000) — el número de pedidos. Cada una de las siguientes n líneas contiene un par de números enteros li, ri (0 ≤ li  &le ; ri ≤ 109).

Salida:
Imprime el número máximo de pedidos que se pueden aceptar.

Ejemplos:
 
Entrada Salida
2
7 11
4 7
1
5
1 2
23
34
4 5
5 6
3
6
48
15
47
25
1 3
68
2