Vacaciones de Xiao Sun
Puntos de conocimiento involucrados:
- Enumeración / puntero doble / combinación de intervalos
solución:
- \ (El título es para permitirle generar la mayor longitud de intervalo descubierta \)
- \ (Primero ordenar según l de pequeño a grande, si l es igual, ordenar según r de pequeño a grande \)
- \ (¿Cuándo habrá un feriado conectado? Inicialice j = 1, i = 2, similar al puntero doble \)
- \ (Atravesando i, a [j] .r <= a [i] .l (i> j), la duración de las vacaciones es a [i] .l-a [j] .r-1, luego deje que j = i \)
- $ De lo contrario, si a [j] .r> a [i] .l, los dos intervalos se cruzan, no hay vacaciones, a [j] .r debe actualizarse al máximo (a [j] .r, a [i]. r]) $
- \ (Sobre el punto final izquierdo y el punto final derecho, es necesario discutir por situación, para ser menos problemático, agregué dos intervalos: \)
- \ (a [++ n] .l = 0, a [n] .r = 0; a [++ n] .l = m + 1, a [n] .r = m + 1; \)
std:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 100005;
struct node{
int l,r;
}a[maxx];
bool cmp(node p1,node p2){
if(p1.l == p2.l)
return p1.r < p2.r;
return p1.l < p2.l;
}
int main()
{
int n,m,ans = 0;
scanf("%d %d",&m,&n);
for(int i=1;i<=n;i++){
scanf("%d %d",&a[i].l,&a[i].r);
}
a[++n].l = 0,a[n].r = 0;
a[++n].l = m+1,a[n].r = m+1;
sort(a+1,a+1+n,cmp);
for(int i=2,j=1;i<=n;i++)
{
if(a[i].l <= a[j].r)
a[j].r = max(a[j].r,a[i].r);
else{
ans = max(ans,a[i].l - a[j].r -1);
j = i;
}
}
cout<<ans<<endl;
return 0;
}